MSVC, Clang ve GCC bu koda katılmıyor:
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 benzer bir hata verir ve MSVC hiçbir hata vermez.
Tam burada kim?
Sanırım bu [class.member.lookup] ' da ele alınmaktadır , ancak bu dava için bana ne anlatmaya çalıştığını anlamakta zorlanıyorum. Lütfen ilgili parçaları belirtin ve mümkünse açık İngilizce olarak açıklayın.
Not: Bu sorudan esinlenilmiştir Neden Temel Sınıfa Referans :: -operator türetilmiş sınıfla neden belirsizdir?
PPS: Aslında benim kuşkum, Der1::Basetipe atıfta bulunulması, bu tip Base(ve sonra Der2::Basetam olarak aynı tip) veya alt nesneye atıfta bulunulmasıdır . Ben ilk olduğuna ikna oldum, ancak ikincisi ise MSVC doğru olurdu.
::Base, ancak asıl soru burada biraz farklı görünüyor. İki tür alt nesne vardır Baseve her ikisinin de bir Base::x üyesi vardır.