为什么clang不会产生关于阴影的警告?

时间:2014-09-25 10:39:36

标签: c++ g++ warnings clang++

请考虑以下代码:

class A {
  A(int x) {
    y_ = x;
  }
  void x() {
  }
  int y_;
};
int main() {
}

如果我使用-Weverything使用最新的clang编译它,它将不会产生任何警告。但是如果我使用带有-Wall -Wshadow的g ++编译它,它将产生

x.cpp: In constructor ‘A::A(int)’:
x.cpp:2:12: warning: declaration of ‘x’ shadows a member of 'this' [-Wshadow]
   A(int x) {
        ^

为什么这两个产生不同的警告?谁是对的?是bug吗?

1 个答案:

答案 0 :(得分:2)

为什么他们不应该发出不同的警告?两者都不是“正确的”。标准并未强制要求对此类事件发出警告,因此完全由编译器编写者决定他们认为用户可能会发现警告有用的内容。

请注意,关于哪个x被使用的任何混淆都可能导致尝试“调用”变量(对于函子有意义)或者分配或读取函数。许多(但不是全部)这样的偶然用户无论如何都会是彻头彻尾的编译器错误。对于许多人(包括我)命名约定ala member_variable_删除了参数与成员变量冲突的可能性。

我从来没有想过这样的警告,并且知道海湾合作委员会提供一个并且经常和快乐的GCC用户不会引导我打开它,所以这样的警告中是否有价值是有争议的。很难知道它可能导致错误被避免的频率,以及它可能会从更重要的警告或实际编码中删除注意力的频率,导致更多的错误!