MSVC, Clang và GCC không đồng ý với mã này:
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 đưa ra một lỗi tương tự và MSVC không có lỗi.
Ai ở ngay đây?
Tôi cho rằng điều này được đề cập trong [class.member.lookup] , nhưng tôi gặp khó khăn trong việc hiểu những gì nó đang cố nói với tôi cho trường hợp này. Vui lòng trích dẫn các phần có liên quan và nếu có thể giải thích bằng tiếng Anh.
PS: Lấy cảm hứng từ câu hỏi này Tại sao Tham chiếu đến Lớp cơ sở mơ hồ với lớp dẫn xuất máng :: -operator?
PPS: Trên thực tế, nghi ngờ của tôi là liệu Der1::Base
tham chiếu đến loại, đó sẽ là Base
(và sau đó Der2::Base
chính xác là cùng loại) hay với tiểu dự án. Tôi tin rằng đó là cái đầu tiên, nhưng nếu nó là cái sau thì MSVC sẽ đúng.
::Base
, nhưng câu hỏi thực sự có vẻ hơi khác nhau ở đây. Có hai tiểu loại loại Base
và cả hai đều có Base::x
thành viên.