Это вызвано поворотом при поиске имени в C ++ 03: проверка однозначного подобъекта была частью поиска имени члена класса в C ++ 03. Поиск в C ++ 03 найдет D :: X и C :: x и A :: x, где A :: x совпадает, но связан с двумя различными подобъектами типа A.
В C ++ 0x проверка однозначного подобъекта теперь является частью соответствующих подпунктов, см. DR # 39 : класс, в котором x
является прямым членом, является неоднозначной базой поэтому пункт 5 вызовет ошибку компиляции вместо пункта 10.
Обратите внимание, что в комментарии говорится о подобъектах A
. Существует один подобъект A
, который проходит по пути B
, и другой подобъект A
, который проходит по пути C
. Вот почему в комментарии говорится "B::x
или C::x
". Присутствие нескольких подобъектов одного и того же типа класса можно определить, просто пытаясь преобразовать его в тип класса, игнорируя проблемы доступности: если преобразование неоднозначно, подобъект появлялся несколько раз.