首页 > 解决方案 > 在类中使用 C++20 中的“使用枚举”可能吗?

问题描述

这个答案中提到,在即将到来的 C++20 标准中,可以使用using语句 onenum class并将枚举字段导入本地命名空间。

我想知道这是否也意味着我也可以在这样的类定义中使用它:

class Foo {
    enum class Color
    {
        red, 
        blue
    };
    using enum Color;
};

int main()
{
    Foo::Color c = Foo::red;
}

还是我还需要提供完整的命名空间?:

    Foo::Color c = Foo::Color::red;

我在 wandbox.org 中尝试过,但似乎 gcc 和 clang 都不知道using enum

标签: c++enumsc++20enum-class

解决方案


是的,Foo::Red会正常工作。using enum E表现为,来自[enum.udecl]

using-enum-declaration引入了命名枚举的枚举器名称,就好像通过每个枚举器的using-declaration一样。

该标准包含一个正是这种情况的例子:

[注意:类作用域中的using-enum-declaration将命名枚举的枚举数作为成员添加到作用域中。这意味着它们可用于成员查找。[ 例子:

enum class fruit { orange, apple };
struct S {
  using enum fruit;             // OK, introduces orange and apple into S
};
void f() {
  S s;
  s.orange;                     // OK, names fruit​::​orange
  S::orange;                    // OK, names fruit​::​orange
}

—结束示例] —结束注释]


但是请注意,围绕此功能的特定拼写存在一些争议。enum E是所谓的详细类型说明符(很像class Cor struct S)。通常,详细类型说明符的行为与其底层版本完全相同。详细说明只是为了消除歧义,您很少需要消除歧义,因此您不会经常看到它。但是,在这种特殊情况下,using enum E并且using E实际上意味着截然不同且完全不相关的事物。因此请记住,尽管目前处于工作草案中,甚至已在 CD 中发布,但该功能可能尚未真正实现 C++20。因此,在确定有必要实现之前,编译器不太可能实现此功能(C++20 并不完全缺乏编译器编写者的工作......)


推荐阅读