【问题标题】:Why clang doesn't produce warning about shadowing?为什么clang不会产生有关阴影的警告?
【发布时间】:2014-09-25 10:39:35
【问题描述】:

考虑以下代码:

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吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    我从不想要这样的警告,而且知道 GCC 提供了一个并且作为一个经常和快乐的 GCC 用户不会让我打开它,所以这样的警告是否有价值是有争议的。很难知道它多久会导致一个错误被避免,以及它多久会从更重要的警告或实际编码中转移注意力,从而导致更多错误!

    【讨论】:

      猜你喜欢
      • 2011-01-16
      • 1970-01-01
      • 2017-12-21
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 1970-01-01
      相关资源
      最近更新 更多