C++ 标准没有说明枚举类的运算符!=()和运算符==()
C++ Standard doesn't say anything about operator!=() and operator==() for enum classes
第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
WHITE
和BLACK
(如果你有一个奥赛罗板说,碰巧我在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) {
。
相关文章:
- 标准库类型的赋值运算符的引用限定符
- 标准::变体的赋值运算符
- 标准::可选枚举的比较运算符
- 重载运算符 + 用于向量:命名空间标准
- 与标准中的"运算符<<"不匹配
- 如何为缺少预定义运算符而不扩展命名空间"std"的标准类型定义运算符>> (istream &, ...)?
- c++标准是否指定了运算符&&(内置)的求值顺序?
- 运算符的要求<恒定性在标准::stable_sort
- 标准::矢量的通用运算符>>
- C++ - <<运算符重载,链表 - 地址而不是标准输出
- 为什么标准在移动分配运算符中使用交换?
- 在全局命名空间中重载不依赖于用户定义类型的标准定义类型的运算符是否格式正确?
- 标准::设置运算符的使用<
- 静态与成员运算符重载:标准::运算符<< 和 std::ostream::运算符<<
- 视觉C 在操作数中向标准运算符中的隐式转换
- 是否保证标准提取运算符>>在失败时不会更改参数?
- 如何在不与标准库运算符冲突的情况下为一组相关类重载运算符?
- 是否有标准的C++函数,类似于地址运算符&?
- 重载运算符运算符<在我的类中没有被 STL 使用max_element 标准 Haskell 函数 :: (a -> 也许 a) -> a -> [a]
- 格式化的输出运算符标准iostream对象可以抛出什么样的异常