gpt4 book ai didi

c++ - 仅在与类的其他对象进行比较时,是否有任何理由不将 operator== 作为成员重载?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:06:26 25 4
gpt4 key购买 nike

我一直在互联网上寻找答案,但我找不到任何答案。给出的唯一原因似乎与比较不同类型的对象有关(例如 MyClass == int)。但最常见的用例是将一个类实例与同一类的另一个实例进行比较,而不是与任何不相关的类型进行比较。

换句话说,我确实理解以下方面的问题:

struct A {
bool operator==(int b);
};

但是我找不到任何好的理由在最明显的用例中不使用成员函数:

struct A {
bool operator==(const A&);
};

另一方面,成员重载似乎有两个积极的方面:

  • 无需与函数友好或为成员提供 getter
  • 类(class)用户始终可以使用它(尽管这也可能是缺点)
  • 查找没有问题(出于某种原因,这在我们的 Google 测试中似乎很常见)

operator== 作为非成员函数重载只是一种约定,以使其与其他类中可能的重载保持一致吗?还是有任何其他原因使其成为非成员(member)?

最佳答案

好吧,在你的问题中,你确实忘记了 const限定成员函数,写起来会更难 bool operator==(A&, const A&);一个意外。

如果你有一个隐式构造函数,一个隐式转换为 A 的类或带有 operator== 的基类具有更高优先级的成员函数,如果它在左边就不会工作,但如果它在右边就可以。虽然大多数时候隐式转换不是一个好主意,但继承可能会合理地导致问题。

struct A {
A(int); // Implicit constructor
A();

bool operator==(const A&) const;
};

struct B : A {
bool operator==(const B&) const;
};

void test() {
A a;
B b;
// 1 == a; // Doesn't work
a == 1;
// b == a; // Doesn't work; Picks `B::operator==(const B&) const;`
a == b; // Picks `A::operator==(const A&) const`, converting `b` to an `A&`.
// Equality is no longer symmetric as expected
}

在未来,随着 C++20 operator<=> ,您很可能总是将其实现为成员函数(即 auto operator<=>(const T&) const = default; ),因此我们知道此指南可能会更改。

关于c++ - 仅在与类的其他对象进行比较时,是否有任何理由不将 operator== 作为成员重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57927030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com