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

Iro*_*ior 7 c++ gcc g++ c++11

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

Mic*_*urr 2

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

如果将 的类型更改vlong long-Wconversion它本身就会生成警告(假设int是 32 位)。