G ++ -Wshadow没有警告静态成员阴影

时间:2015-11-16 15:36:29

标签: c++ static g++ member shadowing

我再次失去了几个小时,因为只有愚蠢才能被编译器识别。这是有问题的源代码:

class f {
    static int mVar;
    int g(int x) { int mVar=3; return x+mVar; }
};
int f::mVar = 1;

问题是,我在int前不小心添加了mVar。当我用以下代码编译时:g++ -c -Wall -Wextra -Wshadow shadowtest.cpp我没有收到任何警告,关于静态成员mVar的本地mVar阴影。

但如果我没有声明成员变量是静态的,那么g ++会正确发出警告:

class f {
    int mVar;
    f(int rVar) : mVar(rVar) {};
    int g(int x) { int mVar=3; return x+mVar; }
};

使用g++ -c -Wall -Wextra -Wshadow shadowtest2.cpp编译得到:

shadowtest2.cpp:5:24: warning: declaration of ‘mVar’ shadows a member of ‘f’ [-Wshadow]
     int g(int x) { int mVar=3; return x+mVar; }
                        ^
shadowtest2.cpp:3:9: note: shadowed declaration is here
     int mVar;
         ^

使用g ++ 4.9.2和5.2.1进行测试。

这是正确的行为还是错误?为什么呢?

编辑:我在此处提交了错误报告:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68374

编辑2018-02-12:在这些版本中没有警告:

g++-4.9 (Debian 4.9.4-2) 4.9.4
g++-5 (Debian 5.4.1-4) 5.4.1 20161202
g++-5 (Debian 5.5.0-8) 5.5.0 20171010
g++-6 (Debian 6.3.0-18) 6.3.0 20170516
g++-6 (Debian 6.4.0-12) 6.4.0 20180123
g++-7 (Debian 7.2.0-16) 7.2.0
g++-7 (Debian 7.3.0-3) 7.3.0

但成功警告:

g++-8 (Debian 8-20180207-2) 8.0.1 20180207 (experimental) [trunk revision 257435]

1 个答案:

答案 0 :(得分:3)

对于-Wshadow in the gcc documentation

的描述,这看起来可能是一个错误
  

当局部变量或类型声明影响另一个变量,参数,类型,类成员(在C ++中)或实例变量(在Objective-C中)时发出警告每当内置函数被遮蔽时。请注意,在C ++中,编译器会警告局部变量是否影响显式typedef,但如果它影响struct / class / enum则不会。

特别是考虑到clang警告这个案子。这基本上是一个实施质量问题,因为这不是错误的代码。我会提交a bug report。最有可能的是,他们会提供在这种情况下不发出警告的理由,否则他们最终会修复警告。

如果我们一直回到版本4.5.4 see it live,看起来像gcc用来警告这种情况。

相关问题