我无意中发现了一种令人困惑的情况,我发现一个明显的缩小转换,但我感到失望的是,编译器(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,但使用的是大括号而不是家长。编译器警告在第二种情况下要缩小范围,就像预期的那样。
要明确的是:我并不是在问缩小初始化列表中转换的合法性。我知道这是不合法的-- a2的花括号初始化仅仅是一个理智的检查。我的问题与初始化列表无关。这不是一个重复的问题.
如果编译器不警告我要缩小a1初始化的范围
发布于 2013-06-20 17:36:09
Wsign-conversion将为这一行代码生成警告--当unsigned long和int具有相同的大小时,unsigned long不会产生警告(在许多平台上,甚至在一些64位平台上都是如此)。对于C代码,-Wconversion将隐式地启用-Wsign-conversion,但由于某种原因,C++不会出现这种情况。
如果将v类型更改为long long,则-Wconversion本身将生成一个警告(假设int为32位)。
https://stackoverflow.com/questions/17217101
复制相似问题