考虑这段代码:
#include <iostream>
int main()
{
int i{10.1}; // narrowing, should not compile
std::cout << i << std::endl;
}
根据 C++11 标准,它不应该编译(大括号初始化中的变窄是禁止的。)
现在,编译g++4.9.2 -std=c++11
只发出警告
warning: narrowing conversion of '1.01e+1' from 'double' to 'int' inside { } [-Wnarrowing]
删除-std=c++11
标志会导致有关大括号初始化的警告,但不会缩小:
warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
另一方面,g++5不会编译它,前提是您使用g++5 -std=c++11
. 但是,如果-std=c++11
省略了,那么甚至可以g++5
愉快地编译它,只给出与大括号 init 相关的警告,而不是缩小:
warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
上面的行为似乎有问题,g++4.9
不应该编译代码,g++5
如果你忘记指定-std=c++11
. 这是一个已知问题吗?