我在 The C++ Programming Language,第 4 版中了解了花括号分隔的初始化程序。> 第 2 章:C++ 之旅:基础知识。
我从下面的书中引用。
= 形式是传统的,可以追溯到 C,但如果有疑问,请使用通用的 {} -list 形式(第 6.3.5.2 节)。如果不出意外,它可以使您免于丢失信息的转换(缩小转换;§10.5):
int i1 = 7.2; // i1 becomes 7 int i2 {7.2}; // error : floating-point to integer conversion int i3 = {7.2}; // error : floating-point to integer conversion (the = is redundant)
但是,我无法重现这些结果。
我有以下代码。
#include <iostream>
int main()
{
int i1 = 7.2;
int i2 {7.2};
int i3 = {7.2};
std::cout << i1 << "\n";
std::cout << i2 << "\n";
std::cout << i3 << "\n";
}
当我编译并运行它时,我没有收到任何错误。我收到警告std=c++11
但没有错误。
$ g++ init.cpp
init.cpp: In function ‘int main()’:
init.cpp:6:12: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
int i2 {7.2};
^
$ ./a.out
7
7
7
此外,警告仅针对第二次分配,但没有针对第三次分配的警告。这似乎表明这=
并不是书中提到的真正多余的。如果=
是多余的,则第二个和第三个分配都会产生警告,或者两者都不会产生警告。然后我用-std=c++11
标志编译它们。
$ g++ -std=c++11 init.cpp
init.cpp: In function ‘int main()’:
init.cpp:6:16: warning: narrowing conversion of ‘7.2000000000000002e+0’ from ‘double’ to ‘int’ inside { } [-Wnarrowing]
int i2 {7.2};
^
init.cpp:7:18: warning: narrowing conversion of ‘7.2000000000000002e+0’ from ‘double’ to ‘int’ inside { } [-Wnarrowing]
int i3 = {7.2};
^
$ ./a.out
7
7
7
仍然没有错误。只有警告。尽管在这种情况下,第二个和第三个分配在生成警告方面表现相同。
所以我的问题是:虽然书中提到第二个和第三个赋值是错误的,为什么这段代码没有编译失败?