2012-12-22 43 views
18
struct Bar 
{ 
    Bar() {} 
}; 


struct Foo 
{ 
    Foo() = default; 
    Bar m_bar; 
}; 

int main() 
{ 
    Foo foo; 
} 

當使用C++ 11 default關鍵字和gcc警告-Weffc++,GCC輸出:我可以忽略了gcc警告: '富:: m_bar' 應在成員初始化列表被初始化[-WeffC++]

警告: '富:: m_bar' 應該在成員 初始化列表來初始化[-WeffC++]

它是安全的忽略此警告?我應該向gcc提交錯誤嗎?

+2

「我應該向gcc提交一個bug」 - 不。當你認爲這是一個編譯器錯誤時,它不是。 – 2012-12-22 11:31:54

+2

如果我執行'Bar()= default',我看不到警告。 – Pubby

+5

可惜沒有downvoting的評論... – StoryTeller

回答

27

您可以忽略或取消警告。這是有效的C++指南之一的誤解。指導方針表示優先初始化分配,但在您的示例中,m_bar將被初始化。你的代碼是正確的。

來源:Jonathan Wakely在GCC的bug跟蹤系統:

#項目12:不想初始化分配在構造函數中。

取代第4項:「確保他們使用 之前的對象被初始化」,和G ++反正誤解原來的項目,並警告有關任何 成員沒有MEM-初始化,這是很煩人的: 沒有意義的初始化一個std :: string,它有一個完全安全的默認構造函數。我的 - PR 2972​​的Wmeminit修補程序應替換此項目的當前警告, ,因爲它只會警告構造函數未初始化的成員。

(而且因爲它是一個已知的問題,就沒有必要彙報的錯誤一次。)

+2

沒有比錯誤肯定更糟... –

相關問題