22

C++ 11 で移動コンストラクターと割り当て操作が機能する方法を理解しようとしていますが、親クラスへの委任に問題があります。

コード:

class T0
{
public:
    T0() { puts("ctor 0"); }
    ~T0() { puts("dtor 0"); }
    T0(T0 const&) { puts("copy 0"); }
    T0(T0&&) { puts("move 0"); }
    T0& operator=(T0 const&) { puts("assign 0"); return *this; }
    T0& operator=(T0&&) { puts("move assign 0"); return *this; }
};

class T : public T0
{
public:
    T(): T0() { puts("ctor"); }
    ~T() { puts("dtor"); }
    T(T const& o): T0(o) { puts("copy"); }
    T(T&& o): T0(o) { puts("move"); }
    T& operator=(T const& o) { puts("assign"); return static_cast<T&>(T0::operator=(o)); }
    T& operator=(T&& o) { puts("move assign"); return static_cast<T&>(T0::operator=(o)); }
};

int main()
{
    T t = std::move(T());
    return 0;
}

ただし、VS2012 でコンパイルして実行すると、T0 メンバーの左辺値バージョンが呼び出されることが出力に示されます。

ctor 0
ctor
copy 0  <--
move    <--
dtor
dtor 0
dtor
dtor 0

同様の状況 (わずかに異なるテスト ケース) が移動代入で発生します。T の移動代入演算子は、T0 の「通常の」代入演算子を呼び出します。

私は何を間違っていますか?

4

2 に答える 2