MSVC, Clang und GCC sind sich in diesem Code nicht einig:
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 gibt einen ähnlichen Fehler aus und MSVC gibt keinen Fehler aus.
Wer ist hier richtig?
Ich nehme an, dass dies in [class.member.lookup] behandelt wird , aber ich habe Schwierigkeiten zu verstehen, was es mir für diesen Fall zu sagen versucht. Bitte zitieren Sie die relevanten Teile und erklären Sie diese nach Möglichkeit in einfachem Englisch.
PS: Inspiriert von dieser Frage Warum ist der Verweis auf die Basisklasse mit der von :: -operator durch abgeleiteten Klasse nicht eindeutig?
PPS: Eigentlich bezweifle ich, ob es Der1::Base
sich um den Typ handelt, der wäre Base
(und dann Der2::Base
genau der gleiche Typ ist), oder um das Unterobjekt. Ich bin überzeugt, dass es das erste ist, aber wenn es das letztere ist, dann wäre MSVC richtig.
::Base
, aber die eigentliche Frage scheint hier etwas anders zu sein. Es gibt zwei Unterobjekte vom Typ Base
und beide haben ein Base::x
Mitglied.