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::Base
tipe atıfta bulunulması, bu tip Base
(ve sonra Der2::Base
tam 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 Base
ve her ikisinin de bir Base::x
üyesi vardır.