MSVC, Clang และ GCC ไม่เห็นด้วยกับรหัสนี้:
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
เสียงดังกราวให้ข้อผิดพลาดที่คล้ายกันและ MSVC ให้ไม่มีข้อผิดพลาด
ใครอยู่ที่นี่
ฉันคิดว่านี่จะครอบคลุมใน[class.member.lookup]แต่ฉันมีปัญหาในการเข้าใจสิ่งที่พยายามบอกฉันสำหรับกรณีนี้ กรุณาพูดส่วนที่เกี่ยวข้องและถ้าเป็นไปได้อธิบายเป็นภาษาอังกฤษธรรมดา
PS: แรงบันดาลใจจากคำถามนี้ทำไมอ้างอิงถึงคลาสฐานที่ไม่ชัดเจนกับ :: -operator รางมาระดับ?
PPS: อันที่จริงข้อสงสัยของฉันคือว่าDer1::Base
หมายถึงประเภทที่จะBase
(และจากนั้นDer2::Base
เป็นประเภทเดียวกัน) หรือ subobject ฉันเชื่อว่ามันเป็นครั้งแรก แต่ถ้าเป็นหลัง MSVC จะถูกต้อง
::Base
แต่คำถามจริงดูเหมือนจะแตกต่างกันเล็กน้อยที่นี่ มี subobjects สองประเภทBase
และทั้งสองมีBase::x
สมาชิก