范围的枚举(枚举类)关系运营商

Scoped Enums (enum class) relational operators

本文关键字:枚举 关系 运营商 范围      更新时间:2023-10-16

我已经看着整个地方,我不敢相信这个问题以前从未问过。

标准定义的范围枚举者的订购是吗?说我有以下

#include <iostream>
enum class Fruits {Apple, Orange, Tomato};
int main(){
   std::cout << (Fruits::Apple < Fruits::Orange);
   std::cout << (Fruits::Orange > Fruits::Tomato);
   return 0;
}

// output:
// 1 0

此输出1 0在G 中。但是该标准或编译器特定于?

完成图片并确认是的,定义了订单。我们首先是为什么一个人可以将两个枚举者放在关系表达中...

[expr.rel]

2通常在操作数上进行通常的算术转换 算术或枚举类型...

5如果两个操作数(转换后(都是算术或 枚举类型,每个操作员应产生真实 指定的关系是真实的,如果是错误的。

...在范围枚举的通常算术转换是一个毫无疑问...

[expr]

9许多期望算术操作数或 枚举类型导致转化和产量结果类型类型 方式。目的是产生一种常见类型,这也是 结果。该模式称为通常的算术转换, 定义如下:

  • 如果任何一个操作数都是范围的枚举类型([dcl.enum](,则不会执行转换;如果另一个操作数没有相同的 类型,表达式不明显。

因此,它们不转换,并且只能与相同类型的对象进行比较。给出的枚举者的值(其他答案指定(是确定"如果指定的关系是真实的,如果是false,则每个操作员都会产生true" 。这就是进行比较的方式。

也值得注意的是,枚举类型变量可以采用未列举的值!因此...

enum class foo {
  min, max = 10
};
foo mid = static_cast<foo>(5);

...是有效的,比较mid > foo::min将保持相同,因为前面的段落被推广到包括命名的值不仅仅包括命名值。

在[dcl.enum]点2中指定了值的排序:

如果第一个枚举者没有初始化器,则 相应的常数为零。枚举者定义没有 初始化器使枚举者通过增加 先前的枚举者的价值。

因此,Fruits的值分别为0, 1, 2,并且由于对枚举的比较仅仅是类型的安全整数操作,如您所见。