我偶然发现了一个令人困惑的情况,我发现了一个明显缩小的转换,但我很遗憾编译器(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
答案 0 :(得分:2)
Wsign-conversion
会针对该行代码生成警告 - 当-Wconversion
和unsigned long
具有相同的大小时,int
将不会生成警告(在许多平台上都是如此,甚至一些64位平台)。对于C代码,-Wconversion
将隐式启用-Wsign-conversion
,但由于某种原因,C ++不会发生这种情况。
如果您将v
的类型更改为long long
,则-Wconversion
会自行生成警告(假设int
为32位)。