-Wshadow = global考虑枚举类条目阴影全局.为什么?

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发出警告.

这是一个有效的影子警告,如果是,为什么?

P.W*_*P.W 3

关于此问题,已经提交了一个名为-Wshadow使用枚举类生成不正确的警告”的错误。但是,尚未确认这是一个错误。

Jonathan Wakely认为这不是一个错误,并给出了以下示例。

typedef unsigned char foo;
enum class myenum
{
  foo,
  bar = (foo)-1
};

Is the value -1L or 255?
Run Code Online (Sandbox Code Playgroud)

如果我重命名myenum::foomyenum::Foo代码,默默地改变含义。

myenum::foo如果我重新排序和 的声明,它的含义也会改变myenum::bar,这正是那种值得警告的脆弱代码。

对于问题中发布的示例也是如此。如果在 后声明int A全局,则不再有警告。enum class Foo

另一位用户同意该主题:

在理想的世界中,我们只会在存在歧义时(在用户心中)发出警告,即“bar = (foo) -1”。然而,这可能比当前的警告更加困难和昂贵。