使用列表初始化时编译器不会出错,这会导致信息丢失

时间:2013-07-10 00:11:47

标签: c++ c++11

在c ++ primer(5th)中,它提到了:

  

当与内置类型的变量一起使用时,这种形式的初始化   有一个   重要属性:如果初始化程序可能导致丢失,编译器将不允许我们列出内置类型的初始化变量   信息:

longdouble ld = 3.1415926536;
int a{ld}, b = {ld}; // error: narrowing conversion required
int c(ld), d = ld;  // ok: but value will be truncate

我使用gcc4.8.1编译代码,它只给出警告而不是错误。

g++  -W -Wall -Wextra -pedantic -std=c++0x  -o m main.cpp


main.cpp: In function ‘int main()’:
main.cpp:64:13: warning: narrowing conversion of ‘ld’ from ‘long double’ to ‘int’ inside { } [-Wnarrowing]
     int a{ld}, b= {ld}; 
             ^
main.cpp:64:22: warning: narrowing conversion of ‘ld’ from ‘long double’ to ‘int’ inside { } [-Wnarrowing]
     int a{ld}, b= {ld}; 

是否有任何标志会打开重要属性的功能?

2 个答案:

答案 0 :(得分:2)

快速搜索“gcc诊断标志”会显示文档资源。

在你的程序中,你可以这样做:

#ifdef __GNUC__
#   pragma GCC diagnostic error "-Wnarrowing"
#endif

还有一个命令行选项:-Werror=narrowing,但由于你想根据GCC改变程序本身的语义,因此将它放在源代码中可能更合适。

注意,除了简单的良好形态之外,例如在过载选择中,GCC会正确地诊断出这种情况。

答案 1 :(得分:1)

标准从不要求错误或警告:标准只需要实施来发出诊断。这种诊断是采用编译器错误,警告形式还是完全不同于它们的形式,都超出了标准的范围。