我偶然發現了一個令人困惑的情況,我發現了一個明顯的縮小轉換,但我感到失望的是編譯器(gcc-4.7.2)沒有發出警告,儘管標記爲-Wall -Wnarrowing -pedantic
。請看下面的程序:用圓括號初始化時沒有縮小的警告
struct A {
int m;
A(int m) : m(m) {};
};
int main() {
unsigned long v = 0;
A a1(v); // narrowing, but no warning (should this not cause a warning?)
A a2{v}; // narrowing, warning raised (expected)
}
的a1
初始化似乎沒有那麼多飛從編譯器窺視。爲了確保我不會精神失常,我試圖用相同的方式初始化a1
,但用大括號代替parens。正如預期的那樣,編譯器警告在第二種情況下縮小範圍。
要清楚:我沒有問初始化列表中縮小轉換的合法性。我知道這是不合法的 - a2
的捲曲支撐初始化僅僅是一種健全檢查。 我的問題與初始化列表無關。這不是一個重複的問題。
編譯器不應該警告我縮小初始化a1
?
'a1'的構造函數可以做一個隱式轉換,而'a2'則不能。你爲什麼認爲他們應該是一樣的? –
如果添加'-Wconversion'標誌怎麼辦? –
這不是重複的。我已經意識到縮小初始化列表中的轉換是非法的。我用括號詢問初始化。 –