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

时间:2019-01-28 14:02:28

标签: c++ enums

考虑:

enum class Number {one, two};

if (Number::one < Number::two)
{}

我的理解是,需要将作用域枚举大小写为基础类型或整数,然后可以将其应用于运算符<> ==。但是看起来上面的代码片段可以在没有任何显式重载运算符<的情况下正常工作。

Enumeration declaration 中看不到任何说明。

对于默认范围内的枚举默认支持哪些运算符,C ++标准怎么说?

2 个答案:

答案 0 :(得分:12)

如果您指的是“通常的算术转换”,则是的,当参数是算术或枚举类型时,它们就完成了。只是针对范围内的枚举有一个特殊的符号:

  

[expr]

     

11许多期望算术或   枚举类型原因转换和收益结果类型类似   办法。目的是产生一个通用类型,这也是   结果。这种模式称为通常的算术转换,   定义如下:

     
      
  • 如果任何一个操作数都属于范围枚举类型,则不执行任何转换;如果另一个操作数的类型不同,则表达式格式错误。
  •   

因此,这里讨论了这种情况。由于这两个操作数具有相同的作用域枚举类型,因此只需检查它们是否以一种期望的方式保存特定的关系即可。

答案 1 :(得分:10)

  

我的理解是,作用域枚举需要被区分为基础类型或整数,然后才能应用于运算符<> ==。

两个都为作用域枚举时不行。 SomeScopedEnum < SomeInt格式错误,在这种情况下,您是对的。

[expr.rel]p6

  

如果两个操作数(转换后)均为算术或枚举类型,则如果指定的关系为true,则每个运算符应产生true,如果为false,则产生false