【问题标题】:Is there automatic name lookup for enumerators in c++?c++ 中是否有枚举数的自动名称查找?
【发布时间】:2021-08-10 10:07:46
【问题描述】:

据我所知,目前在 c++ 中没有对此的支持。

例如,

class C{
    struct{
        enum {defaulted, opt1, opt2, ...} flag1;
        enum {defaulted, optA, optB, ...} flag2;
    } flags;
    ...
};

现在假设我们有C obj,使用标志可以做到

obj.flags.flag1 = obj.flags.opt1;

这是不必要的冗长。

但是由于obj.flags.flag1 的类型是已知的,理论上编译器可以在该范围内查找名称opt1 并节省一些输入。

因为标志不在其他任何地方使用,所以最好不要给类型命名(实际上很难找到合适的名称)。 c++20 中的using enum 语法不能解决这个问题,因为:它 1) 需要命名 enum 类型; 2)using 多个enums 可能会导致名称冲突,如此处所示,因为两个enums 都有一个defaulted 成员。

实施这个会有什么困难?这是否已向 C++ 标准委员会提出和/或在某些编译器中实现?

【问题讨论】:

  • 您对命名范围枚举的论点有点没有实际意义。在您的示例中,两个枚举都有一个 defaulted 并且如果不给枚举命名,您将无法区分它们。在您尝试不那么冗长之前,这已经是一个问题
  • 简短回答:不,如果不对 C++ 类型系统和表达式的工作进行重大更改,就无法完成。赋值表达式的行为由其两个操作数的类型决定。对于分配a = b,首先确定ab 的类型,如果b 的类型与b 的类型相同,或者可以隐式转换为a 的类型。您正在寻找根本不同的东西 - 检查 a 的类型,然后使用它来推断解释 b 的一些上下文。
  • @Peter Great。你能写一个答案让我接受吗?

标签: c++ enums scope language-lawyer


【解决方案1】:

很容易有一个名为opt1 的对象可以转换为适当的枚举类型。最好让名称查找行为一致,而不是根据其他操作数的类型制造特殊情况(部分原因是类型通常在名称查找之后确定)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多