问题描述
针对语言律师/挑剔者的“健全性检查”问题:
在这段代码中:
enum my_enum { AValue1,AValue2 };
using alias_1 = enum my_enum;
using alias_2 = my_enum;
alias_1
和 alias_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-name 或 enum-name 可以是一个简单的标识符,也可以是一个 qualified-id。使用 unqualified name lookup 或 qualified 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
}