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
Clang给出了类似的错误,而MSVC没有给出错误。
谁在这里?
我想这已经在[class.member.lookup]中讨论过了,但是我很难理解在这种情况下它试图告诉我什么。请引用相关部分,并在可能的情况下以简明的英语进行解释。
PS:受此问题的启发,为什么引用基类与:: -operator trough派生类不明确?
PPS:实际上,我的疑问是是Der1::Base
指类型,还是类型Base
(然后Der2::Base
是完全相同的类型)还是子对象。我坚信这是第一个,但是如果是后者,那么MSVC是正确的。
::Base
,但是实际的问题在这里似乎略有不同。有两个类型的子对象Base
,并且都有一个Base::x
成员。