MSVC, Dentang dan GCC tidak setuju pada kode ini:
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
Dentang memberikan kesalahan yang sama, dan MSVC tidak memberikan kesalahan.
Siapa di sini?
Saya kira ini tercakup dalam [class.member.lookup] , tetapi saya mengalami kesulitan memahami apa yang ingin saya sampaikan kepada saya untuk kasus ini. Silakan mengutip bagian-bagian yang relevan dan jika mungkin jelaskan dalam bahasa Inggris.
PS: Terinspirasi oleh pertanyaan ini. Mengapa Referensi ke Kelas Dasar ambigu dengan :: -operator melalui kelas turunan?
PPS: Sebenarnya keraguan saya adalah apakah Der1::Base
merujuk pada tipe, apakah itu Base
(dan kemudian Der2::Base
adalah tipe yang sama persis), atau ke subobyek. Saya yakin itu yang pertama, tetapi jika ini yang terakhir maka MSVC akan benar.
::Base
, tetapi pertanyaan sebenarnya tampaknya sedikit berbeda di sini. Ada dua sub-jenis objek Base
, dan keduanya memiliki Base::x
anggota.