C ++ Prog Lang书籍第139页,例如

时间:2019-02-08 23:56:48

标签: c++ type-narrowing

我正在研究Bjarne Stroustrup的“ C ++编程语言”。在第139页上,它给出了以下无法编译的代码示例。

bool b2 {7}; // error : narrowing

当我尝试此示例时,它会编译。谁能解释为什么?

1 个答案:

答案 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