21 November 2022

C++ 核心指南目录

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==()操作,其他也一样。