MSVC, Clang и GCC не согласны с этим кодом:
struct Base { int x; };
struct Der1 : public Base {};
struct Der2 : public Base {};
struct AllDer : public Der1, public Der2 {
void foo() {
Der1::Base::x = 5;
}
};
GCC:
<source>: In member function 'void AllDer::foo()':
<source>:10:21: error: 'Base' is an ambiguous base of 'AllDer'
10 | Der1::Base::x = 5;
| ^
Compiler returned: 1
Clang выдает похожую ошибку, а MSVC не выдает ошибки.
Кто здесь?
Я полагаю, что это описано в [class.member.lookup] , но мне трудно понять, что он пытается сказать мне для этого случая. Пожалуйста, укажите соответствующие части и, если возможно, объясните простым английским языком.
PS: Вдохновлен этим вопросом. Почему ссылка на базовый класс неоднозначна с классом :: -operator через производный класс?
PPS: На самом деле я сомневаюсь, Der1::Base
относится ли это к типу, который будет Base
(а затем Der2::Base
точно такого же типа), или к подобъекту. Я убежден, что это первое, но если оно будет последним, то MSVC будет прав.
::Base
, но реальный вопрос здесь немного отличается. Есть два подобъекта типа Base
, и оба имеют Base::x
члена.