Ste*_*ith 7 c++ gcc gcc-warning
在GCC 7.3和8.2上使用-Wshadow = global进行编译时,编译器会警告以下代码段阴影.
constexpr int A = 0;
class Bar {
public:
enum Bars {
A = 0
};
};
enum class Foo {
A = 0 // warns this entry shadows global declaration of A
};
int main() {
return 0;
}
<source>:11:9: warning: declaration of 'A' shadows a global declaration [-Wshadow]
A = 0
^
<source>:1:15: note: shadowed declaration is here
constexpr int A = 0;
^
Run Code Online (Sandbox Code Playgroud)
因为引用时枚举类需要枚举类的名字,我的理解是,这三个声明A
是分开的:::A
,::Bar::A
,和::Foo::A
.
Clang 7不会使用-Wshadow发出警告.
这是一个有效的影子警告,如果是,为什么?
关于此问题,已经提交了一个名为“-Wshadow
使用枚举类生成不正确的警告”的错误。但是,尚未确认这是一个错误。
Jonathan Wakely认为这不是一个错误,并给出了以下示例。
Run Code Online (Sandbox Code Playgroud)typedef unsigned char foo; enum class myenum { foo, bar = (foo)-1 }; Is the value -1L or 255?
如果我重命名
myenum::foo
为myenum::Foo
代码,默默地改变含义。
myenum::foo
如果我重新排序和 的声明,它的含义也会改变myenum::bar
,这正是那种值得警告的脆弱代码。
对于问题中发布的示例也是如此。如果在 后声明int A
全局,则不再有警告。enum class Foo
另一位用户同意该主题:
在理想的世界中,我们只会在存在歧义时(在用户心中)发出警告,即“bar = (foo) -1”。然而,这可能比当前的警告更加困难和昂贵。