《C++程序设计语言》中bool b2 {7};编译不符问题咨询
为什么
bool b2 {7};在书中说是错误但实际编译成功? 嘿,这个现象其实是标准规则和编译器默认行为之间的差异导致的,我给你拆解下:
1. C++标准里的硬性规定
根据C++11及以后的标准,使用列表初始化({})时,窄化转换(narrowing conversion)是明确被禁止的。把整数7转换成bool属于典型的窄化操作——因为bool只能表示true/false(对应底层的1/0),而7是超出这个有效范围的数值,所以标准明确要求这种代码必须编译失败,这也是Stroustrup书中标注它为错误的原因。
2. 编译器的默认“宽松”行为
很多编译器默认不会严格执行标准的报错要求,而是把问题降级成警告甚至直接放行,主要有这几个原因:
- 未开启严格标准模式:比如GCC、Clang需要加上
-pedantic-errors或者-std=c++11(及更高版本)+-Werror=narrowing,才会把窄化转换当成错误处理。如果没加这些选项,编译器只会弹出警告,不会阻止编译完成。 - 向后兼容的非标准扩展:部分编译器为了兼容旧代码,保留了允许这种转换的非标准扩展,默认情况下不会强制执行标准的窄化检查。
- MSVC的特殊设置:Visual Studio在默认配置下,对列表初始化的窄化转换检查相对宽松,可能只会给出警告而非错误。需要手动开启
/W4警告级别,并加上/WX把警告视为错误,才会触发书中描述的编译失败。
3. 复现书中错误的方法
如果你想验证标准规定的行为,只需要给编译器加上严格符合标准的编译选项:
- 对于GCC/Clang:
g++ -std=c++11 -pedantic-errors your_file.cpp - 对于MSVC:
cl /std:c++11 /W4 /WX your_file.cpp
这样编译时就会像书中描述的那样,直接抛出窄化转换的错误。
内容的提问来源于stack exchange,提问作者Ickyickyicky Ptangzoop Boing
相关产品推荐
相关产品推荐

