首页 > 解决方案 > 通过类成员访问运算符访问作用域枚举器

问题描述

样品单位:

struct Supercalifragilisticexpialidocious
{
    enum class Frob
    {
        Foo, Bar, Baz, Qux
    };

    Frob frob;
};

Supercalifragilisticexpialidocious maker();

void f()
{
    auto g = maker();

    // Allowed?
    if ( g.frob == g.Frob::Baz ) {}
}

此代码被 gcc 9.x 和 10.x 接受,但被 clang 10.x 和 11.x(godbolt 链接)拒绝,并出现如下错误:

<source>:17:28: error: 'Supercalifragilisticexpialidocious::Frob::Baz' is not a member of class 'Supercalifragilisticexpialidocious'

我的问题是:这段代码是否正确(即它只是一个clang错误?)


背景:我想测试g.frob == Supercalifragilisticexpialidocious::Frob::Baz但不必重复类名。在更一般的情况下,我们通过 获取对象auto,类名可能不会立即显而易见,或者可能由于模板而变得困难。

我想出了一种解决方法,decltype(g)::Frob::Baz它似乎在上述代码的两个编译器中都有效——尽管如果g是参考,这再次被 gcc 接受并被 clang 拒绝。

标签: c++enumsclangscoped-enums

解决方案


推荐阅读