在 G++ 中访问相等比较运算符时出现歧义错误

Ambiguity error accessing equality comparison operator in G++

在多重继承的情况下,如果所有父 class 都有自己的相等比较 operator ==,并且子 class 有一个(朋友)函数 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