【问题标题】:C++ Standard doesn't say anything about operator!=() and operator==() for enum classesC++ 标准没有说明枚举类的 operator!=() 和 operator==()
【发布时间】:2014-05-01 19:20:52
【问题描述】:

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

【问题讨论】:

  • 为什么你认为它不应该?标准也没有特别说明int 的这些运算符。
  • @MikeSeymour §5.10 也没有说明枚举类。
  • @WakeupBrazil:确实,它遵循 5.9。我已将我的评论扩展到答案,因为它并非完全微不足道。
  • @PeterHorvath 因此我的经验主义回答,这些事情导致了 GNUC,以及许多其他最终成为标准的事情(例如 BOOST)
  • @PeterHorvath 我觉得你对委员会成员的描述相当傲慢。

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


【解决方案1】:

枚举的整个点是相等(而不是)测试。 ints 有一个订单,1EMPTY WHITEBLACK(如果你有一个奥赛罗棋盘说,碰巧我在 2 小时前工作)是 WHITE> BLACKWHITE%EMPTY 呢,不,但我可以说整件事

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

当然是enum class Piece;

case 就像我说的相等比较:

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

什么的。

【讨论】:

  • @DarkCthulhu 你不明白什么?
【解决方案2】:

内置运算符在 5.10 中指定:

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

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

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

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

【讨论】:

  • 我有点不情愿地接受你的回答。在这一点上,标准似乎并不完全正确。这可能是他们在 C++14 草案中更改第 5.10 节中的措辞的原因,如 Vlad 的回答所示。
  • @WakeupBrazil 该标准是正确的,因为它可以自我验证;)
  • @WakeupBrazil:我不知道您所说的“不完全正确”是什么意思。我同意一个独立的规范(每个 C++14)比遵循另一个规范更清晰;但据我所知,两者都是等价的。
【解决方案3】:

来自 C++ 标准

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

如您所见,无论它们是作用域还是非作用域的枚举都可以在相等运算符中使用

【讨论】:

  • C++11 标准中的 5.10 不是您在上面发布的。
  • @Wake up Brazil 我从草稿 #N3691 日期 2013-05-16 发布。好像是 C++ 2014 的草案。:)
  • @WakeupBrazil:这似乎来自C++14 draft
猜你喜欢
  • 2023-03-25
  • 2016-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 2015-02-11
相关资源
最近更新 更多