在类中使用 C++20 中的"使用枚举"可能吗?

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

本文关键字:枚举 中的 C++20      更新时间:2023-10-16

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

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

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]:

using枚举声明

引入了命名枚举的枚举器名称,就像通过每个枚举器的use声明一样。

该标准包含这种情况的示例:

[ 注意:类作用域中的using-enum-声明将命名枚举的枚举器作为成员添加到作用域中。这意味着成员查找可以访问它们。[ 示例:

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 Cstruct S(。通常,精心设计的类型说明符的行为与其基础版本完全相同。阐述只是为了消除歧义,你很少需要消除歧义,所以你不会经常看到它。然而,在这种特殊情况下,using enum Eusing E实际上意味着截然不同且完全不相关的事情。因此,请记住,尽管目前在工作草案中,甚至已经在裁谈会上发表,但这一特点可能还没有真正达到20 C++。因此,编译器不太可能实现此功能,直到他们确定有必要实现(C++20 编译器编写者并不完全缺乏工作......