这种情况应该发生什么:
struct A {
void f();
};
struct B : virtual A {
using A::f;
};
struct C : virtual A {
using A::f;
};
struct D : B, C {
void g() {
f();
}
};
感兴趣的线是 f()
。显然f
根据10.2
FDIS 的查找成功并找到A::f
。但是,超载决议会考虑哪些候选人?规范说13.3.1p4
:
对于通过 using 声明引入派生类的非转换函数,该函数被认为是派生类的成员,以便定义隐式对象参数的类型。
这样做的目的是,对于单个类,如果此类包含自己的成员函数和将基类函数的名称带入作用域的 using 声明,则在重载决策期间,所有候选函数在其隐式对象中具有相同的类类型范围。但这对上面的例子意味着什么?候选人会是以下吗?
void F1(B&)
void F2(C&)
// call arguments: (lvalue D)
这似乎是错误的,因为我们在查找结果集中只有一个声明10.2p7
。我们该如何解释这个??