2014-03-24 26 views
0

7.2節枚舉聲明==操作符()不說的operator!=()operator==()的範圍的列舉任何東西。但下面的代碼編譯。C++標準並沒有說明任何操作!=()和枚舉類

#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'; 
} 
+0

爲什麼你期待它不應該?標準沒有特別說明這些運算符對'int'的含義。 –

+0

@MikeSeymour§5.10也沒有爲枚舉類說任何東西。 –

+0

@WakeupBrazil:的確,它按照5.9。我已經將我的評論擴展爲一個答案,因爲它不是微不足道的。 –

回答

6

內置運營商都在5.10指定:

的==(等於)和=(不等於)運算符具有相同的語義限制,轉換和結果類型作爲!關係運算符除了它們的優先級較低和真值結果之外。

這將規範推遲到5.9中的關係運算符;對於用於由5.9/5指定枚舉:

如果兩個操作數(轉化後)是算術或枚舉類型的,每個操作的應如果指定的關係是真假如果是假得到真。

因此,正如人們所預料的那樣,比較運算符適用於比較數值的枚舉。

+0

我接受你的回答有些不情願。在這一點上,標準似乎並不完全正確。這可能就是他們爲什麼改變C++ 14草案中第5.10節的措辭的原因,如Vlad的答案所示。 –

+0

@WakeupBrazil標準是正確的,因爲它證實了自己;) – OMGtechy

+0

@WakeupBrazil:我不知道你的意思是「不完全正確」。我同意一個獨立的規範(每個C++ 14)比推遲到另一個規範更清晰。但據我所見,兩者都是相同的。 –

1

枚舉的整點是一個平等(而不是)測試。 int■找訂單,1 < 2,但EMPTYWHITEBLACK(如果你haev的奧賽羅板說,這只是恰巧我正在一個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) { 

什麼的。

+0

@DarkCthulhu你沒有得到什麼? –

+0

之前無法看到代碼。沒關係。 –

2

從C++標準

5.10相等運算符[expr.eq] 1 ==(等於)和!=(不等於)運算符組左到右。這些操作數應該有 算術,枚舉,指針或指向成員類型的指針,或者 類型std :: nullptr_t。運算符==和!=都產生true或false,即 ,即bool類型的結果。在下面的每種情況下,在應用指定的轉換後,操作數應該爲 。

正如你看到枚舉independing他們是否是局部的或無範圍可以在平等的運營商使用

+0

5.10在C++ 11標準中不是你在上面發佈的內容。 –

+0

@醒來巴西我從草案#N3691發佈日期2013-05-16。它似乎是C++ 2014的草稿。:) –

+0

@WakeupBrazil:這似乎來自[C++ 14草案](http://isocpp.org/files/papers/N3797.pdf)。 –