在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/

10-11 00:21