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;
}
};
海合会:
<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 给出了类似的错误,而 MSVC 没有给出错误。
谁在这里?
我想这在[class.member.lookup]中有所涉及,但我很难理解它试图告诉我这个案例的内容。请引用相关部分,并尽可能用简单的英语解释。
PS:受这个问题的启发,为什么对基类的引用与 :: -operator 槽派生类不明确?
PPS:实际上我的疑问是Der1::Base
指的是类型,那将是Base
(然后Der2::Base
是完全相同的类型),或者是子对象。我确信它是第一个,但如果是后者,那么 MSVC 将是正确的。