【问题标题】:Which operators are automatically defined for scoped enumerations?为作用域枚举自动定义了哪些运算符?
【发布时间】:2021-07-26 18:16:12
【问题描述】:

对于无范围的枚举,答案是“大多数”,因为隐式转换为基础整数类型。但是,作用域枚举没有这种隐式转换。相反,为它们定义了一些但不是所有可用于无范围枚举的运算符。

#include <iostream>

enum class Color{
    Red,
    Green,
    Blue
};

int main()
{
    std::cout << (Color::Red < Color::Green) << '\n';
    // Fine, operator< is defined for Color
    std::cout << (Color::Red + Color::Green == Color::Green) << '\n';
    // no match for 'operator+'
}

我的猜测是关系运算符已定义,但算术运算符未定义,但我在the cppreference page 上没有看到任何明确的说法,并且没有进行实际的标准潜水以了解 C++ 正确必须做什么说说这件事。

【问题讨论】:

  • 您可以在此处找到该信息:Comparison operators。其他操作也一样。似乎 cppreference 没有总结这些信息。

标签: c++ enums operators


【解决方案1】:

通过 [expr.rel]

选择关系运算符

通常的算术转换是在算术或枚举类型的操作数上执行的。如果两个操作数都是指针,则执行指针转换和限定转换以将它们变为它们的复合指针类型。转换后,操作数的类型应相同。

算术运算符通过省略选择退出。例如:[expr.add]

左边的操作数是一个完全定义的对象类型的指针,右边的操作数是整数或无作用域的枚举类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 2018-12-09
    相关资源
    最近更新 更多