哪些操作符是为作用域枚举自动定义的?



对于无作用域的枚举,答案是"大多数";因为隐式转换到底层的整型。但是,限定作用域的枚举没有这种隐式转换。相反,为它们定义了一些可用于无作用域枚举的操作符,但不是所有操作符。

#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+'
}

我的猜测是关系运算符被定义了,但是算术运算符没有定义,但是我在cppreference页面上没有看到任何明确的说明,也没有做过实际的标准研究,以了解c++规范对这个问题有什么规定。

关系运算符通过[expr.rel]

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

算术运算符是通过委托选择的。例如:[expr.add]

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

最新更新