我正在阅读 Stroustrup 的书“编程:使用 C++ 的原则和实践”。类型安全章节指出应避免缩小转换。作为对象初始化的安全方法之一,提出了用花括号int x{100}进行初始化的方法。在实验过程中,我故意编写了错误的代码
int main() {
int x = 1000;
char y {x};
int mee = y;
cout << mee;
}
为什么 gcc 编译器执行程序时只发出警告:警告:将“x”从“int”缩小到“char”的转换[-Wnarrowing]。毕竟,这种类型的初始化禁止缩小转换。我预计在 MSVC 中会看到这样的错误。
这是一个错误,但这种行为在 gcc 4.7 中被有意改变。问题在于编译用 c++03 到 c++11 编写的大量代码。
人们抱怨他们的代码写得像这样:
显然
i
它没有超出大小char
,但随着新标准的发布,这段代码停止编译并开始产生一堆错误。您可以通过使用该标志进行编译,使这些警告成为错误
来源:https ://gcc.gnu.org/wiki/FAQ#Wnarrowing