在 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
, Clang 抱怨说call to member function 'f' is ambiguous
。但GCC接受程序没有任何错误,demo:https://gcc.godbolt.org/z/5zzbWcs97
这里是哪个编译器?
GCC is correct接受这一点,但最近情况发生了变化。目前的措辞是使用声明类中忽略与类中其他声明不明确的(基类)声明(在某种意义上比重载解析更严格,部分原因是还没有参数列表)。void()
and void() &
成员在这个意义上是模糊的,所以b.f
只找到B
’s f
并且通话有效。
在该标准的先前版本(在撰写本文时,这意味着“已发布”)中,这两个函数都将可用,因为&
区分它们(从某种意义上说,甚至更严格),这不仅会导致调用不明确(如 Clang 所说),而且会导致完全错误,因为基类和派生类函数都经过检查overload他们缺乏兼容性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)