4

在 C++ 中,不能在一个类中重载具有 ref-qualifier 的成员函数和没有 ref-qualifier 的成员函数。但同时可以从父类继承一个成员函数并在子类中重载它,如示例所示:

struct A {
    void f() {}
    //void f() & {} //overload error everywhere
};

struct B : A {
    using A::f;
    void f() & {} //ok everywhere
};

int main() {
    B b;
    b.f(); //ok in GCC only
}

只是在调用的过程中f,铿锵抱怨道call to member function 'f' is ambiguous。但是GCC接受程序没有任何错误,demo:https ://gcc.godbolt.org/z/5zzbWcs97

哪个编译器在这里?

4

1 回答 1

5

GCC接受这一点是正确的,但最近情况发生了变化。当前的措辞是,类中的using 声明会忽略(基类)声明,这些声明与班级。 void()并且void() &成员在这个意义上是模棱两可的,所以b.f只找到B'sf并且调用是有效的。

在标准的以前(在撰写本文时,这意味着“已发布”)版本中,这两个函数都将可用,因为&将它们区分开来(在某种意义上更严格),这不仅会使调用模棱两可(如 Clang说)但完全不正确,因为检查了基类和派生类函数的重载兼容性,而这是它们缺乏的。

于 2021-11-18T18:03:25.433 回答