标签: scoped-enums

通过类成员访问运算符访问作用域枚举器

样品单位:

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 ) {}
}
Run Code Online (Sandbox Code Playgroud)

此代码被 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'
Run Code Online (Sandbox Code Playgroud)

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


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

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

c++ enums clang scoped-enums

7
推荐指数
0
解决办法
69
查看次数

C++:无法从相同类型的常量初始化枚举值

由于未知原因,我无法从constexpr值初始化枚举值。这是我的代码:

enum class Enum: unsigned int; //Forward declaration

constexpr Enum constant = static_cast<Enum>(2);

enum class Enum: unsigned int {
  A = 0,
  B = 1,
  C = B,                                   //This works
  D = constant,                            //This FAILS
  E = static_cast<unsigned int>(constant), //This works
  F = Enum::B                              //This works
};
Run Code Online (Sandbox Code Playgroud)

我无法理解的是为什么我可以写C = B,但不能写D = constantB并且constant具有相同的类型!)

我仍然可以做E = static_cast<unsigned int>(constant),但它太冗长了(在我现实生活中的代码中,每个枚举值都是由constexpr函数调用初始化的,很难放在static_cast<unsigned int>任何地方)。

c++ enums initialization constexpr scoped-enums

5
推荐指数
1
解决办法
312
查看次数

标签 统计

c++ ×2

enums ×2

scoped-enums ×2

clang ×1

constexpr ×1

initialization ×1