Чтобы ответить на вопрос в заголовке, да, Derived1::Base
ссылается на имя введенного класса [class.pre] Base
, как и Derived2::Base
. Оба относятся к классу ::Base
.
Теперь, если Base
будет иметь stati c member x
, то поиск Base::x
будет однозначным. Есть только один.
Проблема в этом примере заключается в том, что x
не является членом c, и AllDer
имеет двух таких членов. Вы можете устранить неоднозначность такого доступа к x
, указав однозначный базовый класс AllDer
, который имеет только один член x
. Derived1
является однозначным базовым классом, и в нем есть один x
член, поэтому Derived1::x
однозначно указывает, какой из двух x
членов в AllDer
вы имеете в виду. У Base
тоже есть только один x
член, но это не однозначное основание AllDer
. Каждый экземпляр AllDer
имеет два подобъекта типа Base
. Поэтому Base::x
неоднозначно в вашем примере. А поскольку Derived1::Base
- это просто другое имя для Base
, это остается неоднозначным.
[class.member.lookup] указывает, что x
ищется в контексте спецификатора вложенного имени, так что это должно быть решено в первую очередь. Мы действительно ищем Base::x
, а не Derived1::x
, потому что мы начали с разрешения Derived1::Base
как Base
. Эта часть выполнена успешно, только одна x
в Base.
Note 12 в [class.member.lookup] явно говорит вам, что использование однозначного поиска имени может все же завершиться неудачей, когда есть несколько подобъектов с тем же именем. D::i
в этом примере в основном ваш Base::x
.