比较运算符重载,编译器为什么不做这项工作?

时间:2013-09-05 13:49:00

标签: c++ operator-overloading comparison-operators

今天我正在实现一种数据类型,我决定重载比较运算符。在这样做时,一个问题突然出现在我脑海中。

作为一名程序员,为什么我必须定义每一个比较运算符,我所做的就是用'<'来定义它们(见下文)? - 也就是说,为什么编译器不会自动为我生成这些。

a == b    =>    !(a<b || b<a)
a != b    =>     (a<b || b<a)
a > b     =>    b < a
a >= b    =>    !(a < b)
a <= b    =>    !(b < a)

我确实理解,出于性能原因完全合理,想要实现的不仅仅是'<'

我知道明显的答案是,因为我可以自己轻松地做到这一点,但我相信编译器/语言规范应该尽一切可能轻松使用该语言。

3 个答案:

答案 0 :(得分:3)

了解std::rel_ops。没有人使用它。

答案 1 :(得分:3)

定义operator<()operator==()以及

#include <utility>
using namespace std::rel_ops;

然后自动定义所有比较运算符。 请参阅cppreference.com

提供的示例

答案 2 :(得分:2)

您可以使用boost::operators。它完全符合您的要求,而且还有更多。