Что должно произойти в этом случае:
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
:
Для функций без преобразования, введенных с помощью использования объявления в производный класс, функция считается членом производного класса с целью определения типа параметра неявного объекта.
Цель этого заключается в том, что для одного класса, если такой класс содержит как собственные функции-члены, так и использование объявления, вносящего имена функций базового класса в область видимости, что при разрешении перегрузки все кандидаты функций имеют один и тот же тип класса в их неявный параметр объекта. Но что это значит для приведенного выше примера? Будут ли кандидаты следующими:
void F1(B&)
void F2(C&)
// call arguments: (lvalue D)
Это кажется неправильным, потому что у нас есть только одно объявление в наборе результатов поиска в соответствии с 10.2p7
. Как мы это интерпретируем?