struct BaseA {
auto operator==(const BaseA& other) const {return other.a == a;}
int a;
};
struct B {
int b;
};
struct A: public BaseA {
auto operator==(const B& other) const {return other.b == a;}
};
int main() {
A a{10};
a == a;
return 0;
}
它不会编译:
error: no match for ‘operator==’ (operand types are ‘A’ and ‘A’)
note: candidate: ‘auto A::operator==(const B&) const’
note: no known conversion for argument 1 from ‘A’ to ‘const B&’
未将BaseA::operator==
列为候选。
但是,如果我注释掉A::operator==
方法,它将编译。
因此,我认为比较运算符会得到一些特殊待遇((有时是为子类生成的,有时不会生成,就像那些不符合5规则的那样),但是经过快速搜索后,情况并非如此。
那么,运算符重载的一些规则?
[auto operator==(const B& other) const
隐藏基数,使用using
struct A: public BaseA {
using BaseA::operator==;
auto operator==(const B& other) const {return other.b == a;}
};
这里的运算符没什么特别的,您将得到类似的错误:
struct BaseA {
auto foo(const BaseA& other) const {return other.a == a;}
int a;
};
struct B {
int b;
};
struct A: public BaseA {
auto foo(const B& other) const {return other.b == a;}
};
int main() {
A a{10};
a.foo(a);
}
编译器在foo
中找到一个A
并停在那里。如果您想同时拥有两者,则需要在范围内显式拉出它:
struct A: public BaseA {
auto foo(const B& other) const {return other.b == a;}
using BaseA::foo;
};