[英]Uniform initialization in C++14 double assigned to float variable does not produce narrowing error
根據我對統一初始化的理解,以下代碼應該會產生縮小錯誤,但不會:
#include<iostream>
int main() {
double d;
float f = {d}; // should produce a narrowing error
return 0;
}
我認為這是一個錯誤,因為編譯器必須考慮d的所有可能值,換句話說,d可以保留的值的范圍大於浮點數可以容納的值。
gcc版本4.9.3
使用g++ -std=c++11
確實會給出警告,但是如果您省略了c ++ 11編譯器標志(使用g ++ 4.9.2),則不會發出警告。
使用clang++ -std=c++14 -stdlib=libc++ -Wall -pedantic -Wdeprecated -Wextra
不會編譯,但是會給出縮小的錯誤,而不僅僅是警告(使用clang ++ 3.6.0)。
需要縮小的轉換才能發出診斷。 警告或錯誤可以滿足要求。
在此處運行您的代碼(我可以鏈接到的壁櫥版本gcc 4.9.2)發出警告
warning: narrowing conversion of 'd' from 'double' to 'float' inside { } [-Wnarrowing]
這滿足了標准的要求。
如果您確實想要一個錯誤,則可以始終使用-Werror
或者將所有警告視為錯誤,或者-pedantic-errors
將縮小轉換范圍視為錯誤。
該標准在“錯誤”和“警告”之間沒有區別。 您的代碼格式不正確,但是標准規定如下:
N4140 [intro.compliance]/2.2:
如果程序包含違反任何可診斷規則或發生本標准中描述為“有條件支持”的結構,而該實現不支持該結構,則應在以下位置發布符合要求的實現至少一條診斷消息。
[intro.compliance]/8:
符合條件的實現可以具有擴展(包括附加的庫函數),只要它們不改變任何格式正確的程序的行為即可。 需要實施以診斷使用根據本國際標准格式錯誤的擴展程序的程序。 但是,這樣做后,他們可以編譯和執行此類程序。
GCC會發出格式錯誤的診斷信息,因此在這方面符合要求。 請注意,如果你通過它會發出一個錯誤-pedantic-errors
。
從這里的錯誤: https : //gcc.gnu.org/bugzilla/show_bug.cgi?id=55783
該標准僅要求“合格的實施方案應發出至少一個診斷消息”,因此允許使用警告編譯程序。 正如安德魯所說,-Werror = narrowing使您可以根據需要將其設置為錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.