2013-11-06

暗黙に定義されたコピー代入演算子が、複数回派生されているvirtual基本クラスのコピー代入演算子を何度呼び出すかは未規定

以下の例を考える。

#include <iostream>

struct V
{
    V & operator = ( V const & )
    {
        std::cout << "V" << '\n' ;
        return *this ;
    }
} ;

struct A : virtual V { } ;
struct B : virtual V { } ;
struct C : A, B { } ; 


int main()
{
    C c1 ;   
    C c2 ;
    c1 = c2 ; // #1
}

#1で、V::operator =が何度呼び出されるかは、未規定である。

より正確に書くと、規格準拠の実装は、上記のコードで、V::operator =を一回呼び出してもいいし、二回呼び出してもいい。

GCCとClangは、二回呼び出すようだ。

No comments: