在 类 中使用 C++20 中的 'using enum' 可能吗?

Use 'using enum' in C++20 in classes possible?

this answer中提到,在即将到来的 C++20 标准中,可以在 enum class 上使用 using 语句并将枚举字段导入本地命名空间.

我想知道这是否也意味着我也可以在 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

是的,Foo::Red 可以正常工作。 using enum E 表现为,从 [enum.udecl]:

A using-enum-declaration introduces the enumerator names of the named enumeration as if by a using-declaration for each enumerator.

并且标准中包含一个正是这种情况的示例:

[ Note: A using-enum-declaration in class scope adds the enumerators of the named enumeration as members to the scope. This means they are accessible for member lookup. [ Example:

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
}

— end example ] — end note ]


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