CppCoreGuidelines C.86 == 操作应该是对称的,且 noexcept
21 November 2022
C.86: Make ==
symmetric with respect to operand types and noexcept
理由
相等操作符的两个操作量非对称处理的话,会让人很惊讶。如果还有类型转化的话,会容易引起错误。
==
操作是基础的操作。程序员在使用过程中应该不用担心会出现错误。
例子
struct X { string name; int number; }; bool operator==(const X& a, const X& b) noexcept { return a.name == b.name && a.number == b.number; }
例子
class B { string name; int number; bool operator==(const B& a) const { return name == a.name && number == a.number; } // ... };
B
的比较操作符接受的第二个计算对象可能会进行类型转换,但是 B
本身不会。
注意
如果一个类有异常值,比如 double
类型的 NaN
,有的人会让这种与异常值比较的操作抛出异常。另外一种办法是让异常值的比较结果为相等,而任何其他值与异常值比较的结果为不相等。
注意
此规则可以应用与所有通常的比较操作符:!=
, <
, <=
, >
和 >=
。
强化
- 标记计算对象类型不同的
operator==()
操作符。其他的也一样:!=
,<
,<=
,>
和>=
。 - 标记是成员函数的
operator==()
操作,其他也一样。