c++ - 枚举比较运算符的重新定义

标签 c++ c++11 enums operator-overloading

<分区>

为什么允许以下运算符重载?

enum class e { a, b, };

constexpr
bool operator == (e l, e r)
{ return l != r; }

constexpr
bool operator != (e l, e r)
{ return !(l == r); }

static_assert(e::a == e::b, "==");
static_assert(e::a != e::a, "!=");

Live example (C++11) .

Live example (C++03) .

我总是将 enum 视为内置类型。我无法为指向我的自定义类型的指针重新定义 operator ==(但我想要!),但可以为相同类型的一对 enum 执行此操作。但是,两者都有内置版本的 operator ==operator !=

这种(似乎是错误的)事情的可能目的是什么?如何利用它获利?

最佳答案

这里的问题似乎是您认为(无作用域的)枚举等于整数。正如我在评论中所说,枚举值可以转换为整数,但它们仍然是自定义类型,您可以为其重载运算符。

参见例如this unscoped enumeration reference , 和 this reference on implicit conversions (特别是关于 integral promotionintegral conversions 的部分)。

关于c++ - 枚举比较运算符的重新定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35223421/

相关文章:

C++ Lambda - 错误 : no matching function for call to

c++ - 更改 ffmpeg 中的 mpeg ts pid 值

c++ - 如何正确地从函数返回中 move 对象?

f# - 在 F# 中将字节转换为枚举的实例

c++ - Qt:QSslSocket::bytesWritten() 信号发出得太频繁

c++ - Xcode 初学者。新文件问题和错误

c++ - 无法从C++中的抽象类绑定(bind)函数

c++ - C++0x 中 C++ 枚举的基础类型

java - Java 中枚举类型实例变量的默认值是多少?

java - 枚举可以有抽象方法吗?