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

时间:2016-02-05 11:45:54

标签: 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 !=的内置版本。

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

2 个答案:

答案 0 :(得分:1)

这里的问题似乎是你认为(无范围)枚举等于整数。就像我在评论中所说的那样,枚举值可以从转换从或转换为整数,但它们仍然是一个自定义类型,您可以为其重载运算符。

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

答案 1 :(得分:1)

枚举是用户定义的类型,与结构,类或联合一样多。

您的代码有效,因为一个运营商在申报时无法看到另一个运营商,因此对==!=的一次调用会调用默认值,并将它们作为整数类型进行比较。

当然,它提供了默认==,但您可以根据需要覆盖它。