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
这里是哪个编译器?
GCC接受这一点是正确的,但最近情况发生了变化。当前的措辞是,类中的using 声明会忽略与类中的其他声明不明确的(基类)声明(在某种意义上比重载解析更严格,部分原因是还没有参数列表)班级。 void()并且void() &成员在这个意义上是不明确的,因此b.f仅找到B\xe2\x80\x99sf并且调用是有效的。
在标准的先前版本(在撰写本文时,这意味着 \xe2\x80\x9cpublished\xe2\x80\x9d)中,这两个函数都可用,因为区分它们(&在某种意义上甚至更严格),这将不仅使调用不明确(如 Clang 所说),而且完全是格式错误的,因为检查了基类和派生类函数的重载兼容性,而它们缺乏这些兼容性。