用括号初始化时没有警告缩小范围

时间:2013-06-20 15:00:14

标签: c++ gcc c++11 g++

我偶然发现了一个令人困惑的情况,我发现了一个明显缩小的转换,但我很遗憾编译器(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

的初始化范围

1 个答案:

答案 0 :(得分:2)

Wsign-conversion会针对该行代码生成警告 - 当-Wconversionunsigned long具有相同的大小时,int将不会生成警告(在许多平台上都是如此,甚至一些64位平台)。对于C代码,-Wconversion将隐式启用-Wsign-conversion,但由于某种原因,C ++不会发生这种情况。

如果您将v的类型更改为long long,则-Wconversion会自行生成警告(假设int为32位)。