MSVC, Clang et GCC sont en désaccord sur ce code:
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 donne une erreur similaire et MSVC ne donne aucune erreur.
Qui est ici?
Je suppose que cela est couvert dans [class.member.lookup] , mais j'ai du mal à comprendre ce qu'il essaie de me dire pour ce cas. Veuillez citer les parties pertinentes et si possible expliquer en anglais simple.
PS: Inspiré par cette question Pourquoi la référence à la classe de base est-elle ambiguë avec la classe dérivée :: -operator trough?
PPS: En fait, mon doute est de savoir si se Der1::Base
réfère au type, qui serait Base
(et Der2::Base
est alors exactement le même type), ou au sous-objet. Je suis convaincu que c'est le premier, mais si c'est le dernier, alors MSVC aurait raison.
::Base
, mais la vraie question semble être légèrement différente ici. Il existe deux sous-objets de type Base
, et les deux ont un Base::x
membre.