【问题标题】:Specifyin "enum" in a using statement - does it make a difference?在 using 语句中指定“枚举” - 它有什么不同吗?
【发布时间】:2021-02-09 14:56:23
【问题描述】:

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

在这段代码中:

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。

【问题讨论】:

    标签: c++ visual-c++ enums language-lawyer compiler-bug


    【解决方案1】:

    我能想到的唯一区别是使用关键字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
    }
    

    【讨论】:

    • 我隐含地假设没有隐藏,但这是一个有效的答案。不过除了隐藏,还有什么?
    • @einpoklum using alias_2 = my_enum; 中隐藏着名字。使用enum,排除非类型名称,然后名称隐藏问题消失。除此之外,我想不出其他的区别。
    • 是的,我明白了。我应该澄清这不是我所追求的症结所在。因此,您的答案很好,但请参阅编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 2018-01-07
    • 2011-02-25
    • 1970-01-01
    相关资源
    最近更新 更多