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: Натхненний цим питанням Чому посилання на базовий клас неоднозначне з :: -оператором через похідний клас?
PPS: Насправді я сумніваюся, чи Der1::Base
відноситься до типу, який був би Base
(і тоді Der2::Base
точно такий же тип), або до субекти. Я переконаний, що це перше, але якщо це останнє, то MSVC було б правильним.
::Base
, але справжнє питання тут здається дещо іншим. Існує два суб’єкти типу Base
, і обидва мають Base::x
члена.