为什么允许关注运算符过载?
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, "!=");
我总是将enum
视为内置类型。我无法重新定义operator ==
指向我的自定义类型(但我想要!),但可以为同一类型的enum
对执行此操作。但是,它们都有operator ==
和operator !=
的内置版本。
这种(似乎是错误的)事情的可能目的是什么?如何利用它获利?
答案 0 :(得分:1)
这里的问题似乎是你认为(无范围)枚举等于整数。就像我在评论中所说的那样,枚举值可以从转换从或转换为整数,但它们仍然是一个自定义类型,您可以为其重载运算符。
参见例如this unscoped enumeration reference和this reference on implicit conversions(特别是有关integral promotion和integral conversions的部分)。
答案 1 :(得分:1)
枚举是用户定义的类型,与结构,类或联合一样多。
您的代码有效,因为一个运营商在申报时无法看到另一个运营商,因此对==
或!=
的一次调用会调用默认值,并将它们作为整数类型进行比较。
当然,它提供了默认==
,但您可以根据需要覆盖它。