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:この質問に触発されましたなぜベースクラスへの参照が::-演算子トラフ派生クラスで曖昧なのですか?
PPS:実際、私の疑問はDer1::Base
、型を参照するのか、それともその型を参照するのかBase
(それからDer2::Base
まったく同じ型になるのか)、またはサブオブジェクトを参照するのかです。私はそれが最初のものであると確信していますが、もしそれが後者であるならば、MSVCは正しいでしょう。
::Base
いますが、実際の質問はここでは少し異なります。タイプの2つのサブオブジェクトがありBase
、どちらにもBase::x
メンバーがあります。