范围枚举(枚举类)关系运算符

时间:2019-05-19 05:21:15

标签: c++ c++11 enum-class relational-operators

我到处都看了,我不敢相信这个问题以前没有问过。

该标准是否定义了范围内的枚举数的顺序? 说我是否有以下内容

#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

以g ++输出1 0。但是这个标准或编译器是特定的吗?

2 个答案:

答案 0 :(得分:2)

值的顺序在[dcl.enum] point 2中指定:

  

如果第一个枚举器没有初始化程序,则   对应的常数为零。没有枚举的枚举数定义   初始化程序为枚举器提供通过增加   前一个枚举数的值加一。

因此,Fruits的值分别为0, 1, 2,并且由于对枚举的比较只不过是类型安全的整数运算而已,因此其行为如您所见。

答案 1 :(得分:2)

要完成图片并确认是,请定义顺序。我们从为什么一个人可以在关系表达式中放置两个枚举数开始...

  

[expr.rel]

     

2通常的算术转换是对   算术或枚举类型...

     

5如果两个操作数(转换后)都是算术或   枚举类型,如果   指定的关系为true,如果为false,则为false。

...其中范围枚举的常规算术转换是无操作...

  

[expr]

     

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

     
      
  • 如果任何一个操作数都属于范围枚举类型([dcl.enum]),则不执行任何转换;如果另一个操作数不相同   类型,则表达式格式不正确。
  •   

因此它们进行转换,并且只能与完全相同类型的对象进行比较。赋予枚举数的值(由另一个答案指定)是确定“如果指定的关系为true,则每个运算符应产生true,如果为false,则为false” 。比较就是这样。

还值得注意的是,枚举类型变量可以采用未枚举的值!例如...

int basicwage, overtimewage, overtime, loyalty, salary;
int check = 0;
string X = "y", qualification, id;
while (X == "y" || X == "Y") {
  cout << "ENTER THE STAFF ID :" << endl;
  cin >> id;
  cout << "ENTER THE Qualification :" << endl;
  cin >> qualification;
  while (check == 0) {
    if (qualification == "alevel")
      check = 1;
    else if (qualification == "diploma")
      check = 1;
    else if (qualification == "degree")
      check = 1;
    else if (qualification == "master")
      check = 1;
    else {
      cout << "ERORR qualification doesn't exist Please enter the right one"
           << endl;
      cout << "ENTER THE Qualification again :" << endl;
      cin >> qualification;
    }
  }
}

...是有效的,并且比较enum class foo { min, max = 10 }; foo mid = static_cast<foo>(5); 将保持不变,因为前一段被概括为不仅仅包含命名值。