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