mxm*_*nkn 9 c++ static g++ member shadowing
再一次,我失去了一些时间,因为仅仅是愚蠢,这可能是编译器已经认识到的.这是有问题的源代码:
class f {
static int mVar;
int g(int x) { int mVar=3; return x+mVar; }
};
int f::mVar = 1;
Run Code Online (Sandbox Code Playgroud)
问题是,我不小心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; }
};
Run Code Online (Sandbox Code Playgroud)
用g++ -c -Wall -Wextra -Wshadow shadowtest2.cppgets 编译:
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;
^
Run Code Online (Sandbox Code Playgroud)
用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
Run Code Online (Sandbox Code Playgroud)
但成功警告:
g++-8 (Debian 8-20180207-2) 8.0.1 20180207 (experimental) [trunk revision 257435]
Run Code Online (Sandbox Code Playgroud)
鉴于gcc 文档中 -Wshadow的描述,这看起来可能是一个错误:
每当局部变量或类型声明遮蔽另一个变量、参数、类型、类成员(在 C++ 中)或实例变量(在 Objective-C 中)或每当内置函数被遮蔽时发出警告。请注意,在 C++ 中,如果局部变量隐藏了显式 typedef,编译器会发出警告,但如果它隐藏了结构/类/枚举,则编译器不会发出警告。
特别是考虑到 clang 对这种情况发出警告。这基本上是一个实现质量问题,因为这不是格式错误的代码。我会提交一份错误报告。他们很可能会提供在这种情况下不发出警告的理由,或者他们最终会修复警告。
如果我们一路回到 4.5.4 版本,看起来 gcc 曾经警告过这种情况。
| 归档时间: |
|
| 查看次数: |
325 次 |
| 最近记录: |