15

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 トラフ派生クラスであいまいですか?

PPS: 実際、私の疑問はDer1::Base、タイプを参照するかBase(そしてDer2::Baseまったく同じタイプである)、またはサブオブジェクトを参照するかです。私は前者だと確信していますが、後者ならMSVCが正しいでしょう。

4

2 に答える 2