web-dev-qa-db-fra.com

Derived1 :: Base et Derived2 :: Base font-ils référence au même type?

MSVC, Clang et GCC ne sont pas d'accord 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;
    }
};

Godbolt

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 des difficultés à 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 Der1::Base fait référence au type, ce serait Base (puis Der2::Base est exactement du même type), ou au sous-objet. Je suis convaincu que c'est le premier, mais si c'est le dernier, MSVC aurait raison.

15
idclev 463035818

La raison pour laquelle vous pouvez faire référence au nom de la classe en tant que membre de la classe est que cpp l'aliase pour une utilisation pratique, comme si vous aviez écrit using Base = ::Base; à l'intérieur de la base.
Le problème auquel vous êtes confronté est que Der1::Base est Base.
Ainsi, lorsque vous écrivez Der1::Base::x, c'est la même chose que Base::x.

2
Dani