在 using 语句中指定“枚举” - 它有什么不同吗?

问题描述

针对语言律师/挑剔者的“健全性检查”问题:

在这段代码中:

enum my_enum { AValue1,AValue2 };

using alias_1 = enum my_enum;
using alias_2 = my_enum;

alias_1alias_2 之间有什么区别吗?也就是说,编译器是否可以以某种方式区别对待它们?我最好的理解是答案是否定的,但是我的一个用户在使用 MSVC 16.8 + CUDA 时遇到了第一种而不是第二种语句的不同编译器行为。类似于 cannot convert argument 1 from 'my_enum' to 'alias_1'

注意事项:

  • 我想,#define enum 或姓名隐藏等病态与答案中的地址相关,但我最感兴趣的是“非病态”情况。
  • 特别询问 C++11,以防万一。
  • 我发现创建 MWE 很困难,因为我自己没有那个编译器,而且我通常不运行 Windows。

解决方法

我能想到的唯一区别是使用关键字 enum(如 elaborated type specifier),非类型名称将从名称查找中排除。

(强调我的)

详细类型说明符中的 class-nameenum-name 可以是一个简单的标识符,也可以是一个 qualified-id。使用 unqualified name lookupqualified name lookup 查找名称,具体取决于它们的外观。 但无论哪种情况,都不会考虑非类型名称

例如

enum my_enum { AValue1,AValue2 };

int main()
{
    int my_enum;
    using alias_1 = enum my_enum; // works; refers to the enum my_enum
    //using alias_2 = my_enum;    // doesn't work; the non-type name my_enum in main() is found
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...