MSVC, Clang e GCC non sono d'accordo su questo codice:
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à un errore simile e MSVC non dà alcun errore.
Chi è proprio qui?
Suppongo che questo sia trattato in [class.member.lookup] , ma ho difficoltà a capire cosa sta cercando di dirmi per questo caso. Si prega di citare le parti pertinenti e, se possibile, spiegare in un inglese semplice.
PS: ispirato a questa domanda Perché il riferimento alla classe base è ambiguo con la classe derivata :: -operator trough?
PPS: In realtà il mio dubbio è se si Der1::Base
riferisce al tipo, che sarebbe Base
(e quindi Der2::Base
è esattamente lo stesso tipo) o all'oggetto secondario. Sono convinto che sia il primo, ma se è il secondo allora MSVC avrebbe ragione.
::Base
, ma la vera domanda sembra essere leggermente diversa qui. Esistono due oggetti secondari di tipo Base
ed entrambi hanno un Base::x
membro.