[英]Why compiler allows narrowing conversions
任何人都可以向我解釋一下,如果初始化器可能導致信息丟失,為什么編譯器允許初始化內置類型的變量?
例如C ++ Primer,第5版說,如果初始化器可能導致信息丟失,編譯器將不會讓我們列出內置類型的初始化變量。
但是我的編譯器gcc v 4.7.1在以下代碼中成功初始化了變量a
:
long double ld = 3.1415926536;
int a{ld};
只有警告:縮小'ld'從'long double'到'int'的轉換{} [-Wararrowing]。
初始化列表的一個功能是不允許縮小轉換。 但語言定義不區分警告和錯誤; 當代碼格式錯誤時,它需要“診斷”,它被定義為來自一組實現定義的消息的任何消息。 警告滿足此要求。 這是非標准擴展的機制:發出警告后,編譯器可以自由地做任何想做的事情,包括根據特定於實現的規則編譯。
您可以設置編譯器標志以將所有警告標記為錯誤。 在這種情況下,只會阻止你這樣做。 否則它只會是一個警告。
這個問題最近出現了。 使用gcc-4.7,命令行開關將打開所需的行為:
g++ -Werror=narrowing ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.