微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在 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
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。