c++ - 在类中使用 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
。
解决方案
是的,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 C
or struct S
)。通常,详细类型说明符的行为与其底层版本完全相同。详细说明只是为了消除歧义,您很少需要消除歧义,因此您不会经常看到它。但是,在这种特殊情况下,using enum E
并且using E
实际上意味着截然不同且完全不相关的事物。因此请记住,尽管目前处于工作草案中,甚至已在 CD 中发布,但该功能可能尚未真正实现 C++20。因此,在确定有必要实现之前,编译器不太可能实现此功能(C++20 并不完全缺乏编译器编写者的工作......)
推荐阅读
- excel - VBA 将电子表格中的 ID 号匹配到另一张工作表然后更新信息的最佳方法
- jquery - 如何使用jQuery移动一个正方形?用户输入像素
- regex - 使用带有 -regex 选项的 find 实用程序查找以特定字母开头的文件
- mysql - 不需要的 MySQL 表名字符大写
- c++ - 二叉树算子深拷贝
- python - 如何将多行 JSON 文件转换为 Dataframe
- ruby - 如何使用 i% 在一行中创建和分配符号?
- azure - Terraform 导入现有资源
- python - 如何将更多 json 数据添加到 python 中的文本文件?
- php - PHP 我创建了一个双变量然后测试它是否相等并且它不匹配?