我偶然发现了一个令人困惑的情况,我发现了一个明显缩小的转换,但我很失望编译器(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)
}
Run Code Online (Sandbox Code Playgroud)
初始化a1似乎没有从编译器窥视那么多.为了确保我不会疯狂,我尝试以a1相同的方式初始化,但用括号而不是parens.正如预期的那样,编译器在第二种情况下警告缩小范围.
要明确:我不是在询问缩小初始化列表中转换的合法性.我知道这不合法 - 卷曲支撑的初始化a2只是一种健全性检查. 我的问题与初始化列表无关.这不是一个重复的问题.
编译器是否应该警告我缩小初始化范围a1?
Wsign-conversion将为该行代码生成警告 -当和具有相同大小-Wconversion时不会生成警告(在许多平台上都是如此,甚至在某些 64 位平台上也是如此)。对于 C 代码,将隐式启用,但由于某种原因,C++ 不会发生这种情况。unsigned longint-Wconversion-Wsign-conversion
如果将 的类型更改v为long long,-Wconversion它本身就会生成警告(假设int是 32 位)。