Resolución de sobrecarga / ambigüedad en la búsqueda de nombre (cuál)

$ 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
}

El comentario en el código en 'f' indica que uno puede esperar ambigüedad entre 'B :: x' o 'C :: x'.

Sin embargo, al compilar con g ++ (ideone) o Comeau, los errores son ligeramente diferentes. Estos errores en lugar de indicar ambigüedad en B :: x o C :: x indican el hecho de que A es una base ambigua de D

prog.cpp: en la función "int f (D *)": prog.cpp: 16: error: "A" es una base ambigua de "D"

Y

"ComeauTest.c", línea 21: error: la clase base "A" es ambigua return d-> x (); // ambiguo: B :: x o C :: x

Siguiendo las reglas de búsqueda de nombres en $ 10.2, tengo la sensación de que el comentario en el fragmento de código no es realmente correcto. De hecho, el error está relacionado principalmente con la ambigüedad de la clase base 'A' en lugar de cualquier otra cosa (por ejemplo, ambigüedad en la resolución de sobrecarga). ¿Alguna idea?

Respuestas a la pregunta(2)

Su respuesta a la pregunta