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:

Post a Comment

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.