【发布时间】:2015-02-11 22:48:47
【问题描述】:
考虑这段代码:
#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 也会愉快地编译它,只给出与大括号初始化相关的警告,而不是缩小:
warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
上述行为似乎有问题,g++4.9 不应该编译代码,如果你忘记指定 -std=c++11,g++5 编译它就更奇怪了。这是一个已知问题吗?
【问题讨论】:
-
@MattMcNabb 即使是这种情况,在没有 -std=c++11 的情况下编译时,g++5 至少应该发出警告而且让我感到困惑的事实是,即使在 Stroustroup页面,stroustrup.com/C++11FAQ.html#narrowing 他谈到“如何防止缩小”。 IMO,只是发出警告并不能阻止任何事情。
-
这与 int foo = 1.0f 相同,它可以在任何地方编译,但如果级别足够高(msvc 上的 lvl 4)会生成警告
-
@paulm 它并不完全一样。大括号初始化的“特性”之一就是这个特性,它可以防止变窄。但看起来编译器只需要发出警告。在上面的链接中,B. Stroustroup 甚至说:“但是,在 C++11 中,{} 初始化不会缩小:...”