7

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

4

1 回答 1

2

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

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

于 2013-06-20T17:36:09.767 回答