我偶然发现了一个令人困惑的情况,我发现了一个明显的缩小转换,但我感到失望的是编译器(gcc-4.7.2)没有发出警告,尽管标记为-Wall -Wnarrowing -pedantic
。请看下面的程序:用圆括号初始化时没有缩小的警告
struct A {
int m;
A(int m) : m(m) {};
};
int main() {
unsigned long v = 0;
A a1(v); // narrowing, but no warning (should this not cause a warning?)
A a2{v}; // narrowing, warning raised (expected)
}
的a1
初始化似乎没有那么多飞从编译器窥视。为了确保我不会精神失常,我试图用相同的方式初始化a1
,但用大括号代替parens。正如预期的那样,编译器警告在第二种情况下缩小范围。
要清楚:我没有问初始化列表中缩小转换的合法性。我知道这是不合法的 - a2
的卷曲支撑初始化仅仅是一种健全检查。 我的问题与初始化列表无关。这不是一个重复的问题。
编译器不应该警告我缩小初始化a1
?
'a1'的构造函数可以做一个隐式转换,而'a2'则不能。你为什么认为他们应该是一样的? –
如果添加'-Wconversion'标志怎么办? –
这不是重复的。我已经意识到缩小初始化列表中的转换是非法的。我用括号询问初始化。 –