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