簡體   English   中英

C ++ 14中雙重初始化分配給float變量的統一初始化不會產生縮小錯誤

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

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