为什么作用域枚举默认支持运算符'<'?

SSY*_*SSY 12 c++ enums

考虑:

enum class Number {one, two};

if (Number::one < Number::two)
{}
Run Code Online (Sandbox Code Playgroud)

我的理解是,scoped枚举需要被包装到底层类型或整数中,然后它可以应用于operator <> ==.但看起来上面的代码片段可以在没有任何显式重载运算符的情况下工作<.

我在枚举声明中没有看到任何描述.

C++标准说明默认情况下哪个运算符支持作用域枚举?

Sto*_*ica 12

如果您指的是"通常的算术转换",那么当参数是算术或枚举类型时,它们就完成了.只是在那里有一个特殊的子弹用于范围的枚举:

[EXPR]

11许多期望算术或枚举类型操作数的二元运算符会以类似的方式引起转换并产生结果类型.目的是产生一个通用类型,它也是结果的类型.此模式称为通常的算术转换,其定义如下:

  • 如果任一操作数是作用域枚举类型,则不执行任何转换; 如果另一个操作数的类型不同,则表达式格式不正确.

所以这里涉及到这个案例.由于两个操作数具有相同的作用域枚举类型,因此只需检查它们以按照预期的方式保持特定关系.


Rak*_*111 10

我的理解是,scoped enum需要被装入底层类型或整数,然后它可以应用于operator <> ==.

不是当它们都是作用域枚举时.SomeScopedEnum < SomeInt是不正确的,在这种情况下你是对的.

[expr.rel] p6:

如果两个操作数(转换后)都是算术类型或枚举类型,则每个运算符应true在指定关系为真且false是否为假时生成.

  • @SSY 是的,你可以。 (2认同)