对于枚举类,C ++ Standard没有说运算符!=()和运算符==()

时间:2014-03-24 12:26:40

标签: c++ c++11 enums operator-overloading language-lawyer

第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';
}

3 个答案:

答案 0 :(得分:6)

内置运算符在5.10中指定:

  

==(等于)和!=(不等于)运算符与关系运算符具有相同的语义限制,转换和结果类型,除了它们的优先级和真值结果较低。

这将规范推迟到5.9中的关系运算符的规范;对于由5.9 / 5指定的枚举:

  

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

因此,正如人们所预料的那样,比较运算符适用于枚举,比较数值。

答案 1 :(得分:2)

来自C ++标准

  

5.10 Equality运算符[expr.eq] 1 ==(等于)和!=(不等于)运算符组从左到右。操作数应具有   算术,枚举,指针或指向成员类型的指针,或   输入std :: nullptr_t。运算符==和!=都生成true或false,   即bool类型的结果。在下面的每种情况下,操作数应为   在应用指定的转换后,它们具有相同的类型。

如您所见,枚举可以在等式运算符中使用,而不是它们是作用域还是未作用域

答案 2 :(得分:1)

枚举的WHOLE POINT是一个相等(而不是)的测试。 int有一个订单,1&lt; 2,但是EMPTY WHITEBLACK(如果你有一个奥赛罗董事会说,我正在努力做一个2小时前)WHITE&gt; BLACKWHITE%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) {

或其他什么。

相关问题