在g++中访问相等比较操作符时出现歧义错误



在多重继承的情况下,如果所有父类都有自己的相等比较operator ==,并且子类有一个(友)函数operator ==,如:

struct A {
bool operator ==(const A&) const = default;
};
struct B {
bool operator ==(const B&) const = default;
};
struct C : A, B {};
constexpr bool operator ==(const C&, const C&) { return true; }
static_assert( C{} == C{} );

GCC在尝试比较子对象时打印以下关于歧义的错误:

error: request for member 'operator==' is ambiguous
13 | static_assert( C{} == C{} );
note: candidates are: 'bool B::operator==(const B&) const'
note:                 'bool A::operator==(const A&) const'

演示:https://gcc.godbolt.org/z/W3qer376d

这个错误看起来很奇怪,因为operator ==(const C&, const C&)应该被首选为最适合实际参数的。这仅仅是GCC的一个缺陷吗?

全局操作符operator==(const C&, const C&)确实具有优先级。然而,编译器"想知道"换句话说:一旦你尝试使用operator==,编译器要求你没有歧义,即使所需的替代方案不在歧义之间。


struct C : A, B { using A::operator==; }; 

这解决了歧义,并允许您使用全局operator==

https://onlinegdb.com/nxMjPN4NC

#include <iostream>
struct A {
bool operator ==(const A&) const { std::cout << "A" << std::endl; return true; };
};
struct B {
bool operator ==(const B&) const { std::cout << "B" << std::endl; return true; };
};
struct C : A, B 
{
//using A::operator==; // Uncomment this to make it work.
};
bool operator ==(const C&, const C&) { std::cout << "C" << std::endl; return true; }
int main()
{
C c1, c2;

c1==c2;
return 0;
}

结果(解析后):

C

最新更新