在 C++ 中使用带 ref-qualifier 的子成员函数重载不带 ref-qualifier 的父成员函数

Fed*_*dor 7 c++ overloading language-lawyer ref-qualifier function-qualifier

在 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
}
Run Code Online (Sandbox Code Playgroud)

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

这里是哪个编译器?

Dav*_*ing 6

GCC接受这一点是正确的,但最近情况发生了变化。当前的措辞是,类中的using 声明会忽略与类中的其他声明不明确的(基类)声明(在某种意义上比重载解析更严格,部分原因是还没有参数列表)班级。 void()并且void() &成员在这个意义上是不明确的,因此b.f仅找到B\xe2\x80\x99sf并且调用是有效的。

\n

在标准的先前版本(在撰写本文时,这意味着 \xe2\x80\x9cpublished\xe2\x80\x9d)中,这两个函数都可用,因为区分它们(&在某种意义上甚至更严格),这将不仅使调用不明确(如 Clang 所说),而且完全是格式错误的,因为检查了基类和派生类函数的重载兼容性,而它们缺乏这些兼容性。

\n

  • @Fedor http://eel.is/c++draft/namespace.udecl#11 (2认同)