簡體   English   中英

為什么編譯器允許縮小轉換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM