C++ 标准没有说明枚举类的运算符!=()和运算符==()

C++ Standard doesn't say anything about operator!=() and operator==() for enum classes

本文关键字:运算符 标准 说明 枚举 C++      更新时间:2023-10-16

第7.2节枚举声明没有说明作用域枚举的operator!=()operator==()。但是下面的代码可以编译。

#include <iostream>
enum class Month{jan = 1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov , dec};
int main()
{
    Month a = Month::feb;
    Month b = Month::jul;
    Month c = a;
    if( a != b ) std::cout << "a |= b" << 'n';
    if( a == c ) std::cout << "a == c" << 'n';
}

内置操作符在5.10中指定:

==(等于)和!=(不等于)操作符具有与关系操作符相同的语义限制、转换和结果类型,只是它们的优先级较低且结果为真值。

这将关系操作符的规范推迟到5.9;对于5.9/5指定的枚举:

如果两个操作数(经过转换)都是算术类型或枚举类型,则指定关系为真时,每个操作符都返回真,为假时返回假。

因此,如人们所料,比较操作符适用于枚举,用于比较数值。

来自c++标准

5.10相等运算符[expr。==(等于)和!=(不等于)运算符从左到右分组。操作数必须有算术,枚举,指针,或指向成员类型的指针,或类型std:: nullptr_t。操作符==和!=都产生真或假,即bool类型的结果。在下面的每种情况下,操作数应在应用指定的转换后具有相同的类型。

如你所见,无论枚举是否有作用域,都可以在相等操作符

中使用

枚举的WHOLE POINT是一个相等(而非)测试。int s有一个顺序,1<2,但EMPTY WHITEBLACK(如果你有一个奥赛罗板说,碰巧我在2小时前正在工作)是WHITE> BLACK, WHITE%EMPTY呢,不,但整个要点是,所以我可以说

switch(board.get_square(x,y)) {
    case Piece::WHITE:
        magic();
        break;
    case Piece::BLACK:
        whatever();
        break;
    default:
 }

当然是enum class Piece;

大小写就像是相等比较我说的是

if(board.get_square(x,y) == Piece::WHITE) {