21 November 2022

C++ 核心指南目录

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