MSVC, Clang i GCC nie zgadzają się na ten kod:
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 daje podobny błąd, a MSVC nie daje błędu.
Kto tu jest?
Przypuszczam, że jest to omówione w [class.member.lookup] , ale mam trudności ze zrozumieniem, co próbuje mi powiedzieć w tej sprawie. Proszę podać odpowiednie części i, jeśli to możliwe, wyjaśnić je prostym językiem angielskim.
PS: Zainspirowany tym pytaniem Dlaczego odniesienie do klasy podstawowej jest niejednoznaczne z klasą pochodną :: -operator?
PPS: Właściwie mam wątpliwości, czy Der1::Base
odnosi się do typu, który byłby Base
(a następnie Der2::Base
jest dokładnie tego samego typu), czy do podobiektu. Jestem przekonany, że jest to pierwszy, ale jeśli tak, to MSVC miałoby rację.
::Base
, ale prawdziwe pytanie wydaje się tutaj nieco inne. Istnieją dwa podobiekty typu Base
i oba mają element Base::x
członkowski.