Разрешение перегрузки / неоднозначность в поиске имени (какой)

7,3,3 / 14 (C ++ 03)

struct A { int x(); };
struct B : A { };
struct C : A {
   using A::x;
   int x(int);
};
struct D : B, C {
   using C::x;
   int x(double);
};
int f(D* d) {
   return d->x(); // ambiguous: B::x or C::x
}

Комментарий в коде в 'f' указывает на то, что можно ожидать двусмысленности между 'B :: x' или 'C :: x'.

Однако при компиляции с g ++ (ideone) или Comeau ошибки немного отличаются. Эти ошибки вместо указания неоднозначности в B :: x или C :: x указывают на тот факт, что A является неоднозначным основанием D

prog.cpp: в функции «int f (D *)»: prog.cpp: 16: ошибка: «A» является неоднозначным основанием «D»

А также

"ComeauTest.c", строка 21: ошибка: базовый класс "A" неоднозначен return d-> x (); // неоднозначно: B :: x или C :: x

Следуя правилам поиска имен в $ 10.2, я чувствую, что комментарий во фрагменте кода не совсем корректен. Ошибка действительно в первую очередь связана с неоднозначностью базового класса «А», а не с чем-либо еще (например, неоднозначность в разрешении перегрузки). Какие-нибудь мысли?

Ответы на вопрос(2)

Ваш ответ на вопрос