C++0x confusion with using declarations

Что должно произойти в этом случае:

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 . Как мы это интерпретируем ??

15
задан Johannes Schaub - litb 3 October 2011 в 13:12
поделиться