在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;
^
因为引用时枚举类需要枚举类名称,所以我的理解是
A
的所有三个声明都是分开的:::A
,::Bar::A
和::Foo::A
。Clang 7不会使用-Wshadow发出警告。
这是有效的阴影警告吗?如果是,为什么?
最佳答案
关于此问题,已经存在一个名为" -Wshadow
generates an incorrect warning with enum classes"的错误。但是,尚未确认这是一个错误。
Jonathan Wakely认为这不是错误,并给出以下示例。
对于问题中发布的示例也是如此。如果在int A
的之后将全局enum class Foo
声明为,则不再发出警告。
另一个用户同意该线程:
关于c++ - -Wshadow = global认为枚举类条目是全局的。为什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53841625/