この場合はどうなるでしょうか。
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()
。明らかに、FDISf
によるによるルックアップは成功し、を見つけます。ただし、過負荷解決ではどの候補が考慮されますか?仕様は次のように述べています:10.2
A::f
13.3.1p4
using-declarationによって派生クラスに導入された非変換関数の場合、関数は、暗黙のオブジェクトパラメータのタイプを定義する目的で、派生クラスのメンバーであると見なされます。
これの目的は、単一のクラスの場合、そのようなクラスに独自のメンバー関数と、基本クラス関数の名前をスコープに入れるusing宣言の両方が含まれている場合、過負荷解決中にすべての関数候補が暗黙のオブジェクトで同じクラスタイプを持つことです。パラメータ。しかし、これは上記の例にとって何を意味するのでしょうか?候補者は次のようになりますか?
void F1(B&)
void F2(C&)
// call arguments: (lvalue D)
によるルックアップ結果セットには宣言が1つしかないため、これは間違っているように見えます10.2p7
。これをどのように解釈しますか?