任何人都可以請我解釋一下,爲什麼編譯器允許初始化內置類型的變量,如果初始化器可能會導致信息丟失?爲什麼編譯器允許縮小轉換範圍
例如C++ Primer,第5版說,編譯器不會讓我們列出初始化變量的內置類型,如果初始化器可能導致信息丟失。
但我的編譯器GCC 4.7.1 v在成功地將下面的代碼初始化的變量a
:
long double ld = 3.1415926536;
int a{ld};
只是有警告:從「長雙」到「廉政」內縮小「LD」的轉換{ } [ - 差點]。
任何人都可以請我解釋一下,爲什麼編譯器允許初始化內置類型的變量,如果初始化器可能會導致信息丟失?爲什麼編譯器允許縮小轉換範圍
例如C++ Primer,第5版說,編譯器不會讓我們列出初始化變量的內置類型,如果初始化器可能導致信息丟失。
但我的編譯器GCC 4.7.1 v在成功地將下面的代碼初始化的變量a
:
long double ld = 3.1415926536;
int a{ld};
只是有警告:從「長雙」到「廉政」內縮小「LD」的轉換{ } [ - 差點]。
之一初始化列表的特徵在於,收縮轉換是不允許的。但是,語言定義並不區分警告和錯誤;當代碼格式不正確時,它需要「診斷」,它被定義爲來自一組實現定義消息的任何消息。警告符合這個要求。這是非標準擴展的機制:發佈了警告,編譯器可以自由地做任何事情,包括根據特定於實現的規則編譯內容。
您可以設置編譯器標誌將所有警告標記爲錯誤。在這種情況下,只有它會阻止你這樣做。否則它只會是一個警告。
這個問題最近出現了。用gcc-4.7一個命令行開關接通所需的行爲:
g++ -Werror=narrowing ...
我會說這本書是錯誤的。 C和C++與這種東西非常疏忽...... –
@MatthieuM。 C++ 11不是。 – rubenvb
** n3337 ** ** 4.9/1 [conv.fpint] ** *浮點類型的前值可以轉換爲整數類型的前值。轉換截斷;也就是說,小數部分被丟棄。如果在目標類型中不能表示被截斷的值,那麼行爲是不確定的*因此,轉換是可能的並且在標準中實際定義,不清楚的是它是否被允許*這裏*,並且我還沒有發現任何關於。 –