MSVC, Clang e GCC discordam deste código:
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 dá um erro semelhante e MSVC não dá erro.
Quem está bem aqui?
Suponho que isso seja abordado em [class.member.lookup] , mas tenho dificuldades em entender o que está tentando me dizer para esse caso. Por favor, cite as partes relevantes e, se possível, explique em inglês simples.
PS: Inspirado nesta pergunta Por que a referência à classe base é ambígua com :: -operator através da classe derivada?
PPS: Na verdade, minha dúvida é se Der1::Base
refere ao tipo, que seria Base
(e então Der2::Base
é exatamente o mesmo tipo) ou ao subobjeto. Estou convencido de que é o primeiro, mas se for o último, a MSVC estaria certa.
::Base
, mas a verdadeira questão parece ser um pouco diferente aqui. Existem dois subobjetos do tipo Base
e ambos têm um Base::x
membro.