我正在研究Bjarne Stroustrup的“ C ++编程语言”。在第139页上,它给出了以下无法编译的代码示例。
bool b2 {7}; // error : narrowing
当我尝试此示例时,它会编译。谁能解释为什么?
答案 0 :(得分:6)
大多数编译器(不幸的是恕我直言)在其默认模式下并不完全符合C ++标准。
对于g ++和clang ++,您可以使用选项-std=c++11 -pedantic-errors
来执行语言要求。但是,g ++的发行版本未捕获此特定错误,这是g ++中的缺陷。
使用g ++ 8.2.0,该声明会在没有诊断的情况下错误地编译:
$ cat c.cpp
bool b2 {7};
$ g++ -std=c++11 -pedantic -c c.cpp
$
使用clang ++ 6.0.0,可以正确诊断错误:
$ clang++ -std=c++11 -pedantic -c c.cpp
c.cpp:1:10: error: constant expression evaluates to 7 which cannot be narrowed to type 'bool' [-Wc++11-narrowing]
bool b2 {7};
^
c.cpp:1:10: note: insert an explicit cast to silence this issue
bool b2 {7};
^
static_cast<bool>( )
1 error generated.
$
使用gcc的更新版本(未发布,从源代码构建):
$ g++ -std=c++11 -pedantic -c c.cpp
c.cpp:1:11: error: narrowing conversion of ‘7’ from ‘int’ to ‘bool’ [-Wnarrowing]
1 | bool b2 {7};
| ^
$
clang ++已正确诊断此错误。希望g ++在9.0.0版发布时会这样做。
如果希望在不进行诊断的情况下完成转换,则可以使用其他初始化语法之一,例如:
bool b1 = 7; // sets b1 to true, no diagnostic