19

Visual Studio でコンパイル エラーをいじるのに途方もない時間を費やしました。コードを以下の小さなコンパイル可能な例に抽出し、IdeOne で試してみたところ、ここで確認できる同じエラーが発生しました。

B(const B&)次のコードが代わりに呼び出そうとするのはなぜだろうと思っていますB(B&&):

#include <iostream>

using namespace std;

class A {
public:
    A() : data(53) { }
    A(A&& dying) : data(dying.data) { dying.data = 0; }

    int data;

private:
    // not implemented, this is a noncopyable class
    A(const A&);
    A& operator=(const A&);
};

class B : public A { };

int main() {
    B binst;

    char* buf = new char[sizeof(B)];

    B* bptr = new (buf) B(std::move(binst));

    cout << bptr->data << endl;

    delete[] buf;
}

コンストラクターを明示的に定義していないのでB(std::move(binst))、コンパイラーを generated と呼ぶ必要がB(B&&)ありますか?

私がに変更Bするとき

class B : public A {
public:
    B() { }
    B(B&&) { }
};

それはうまくコンパイルされます。どうしてこれなの?

例のように配置 new および move コンストラクターを使用するテンプレート クラスがあるため、これを基本クラスから修正できないと非常に不便です。私のテンプレート クラスで使用するための要件ではありません)、明示的に定義された移動コンストラクターを持つ必要があります。

4

2 に答える 2

17

Visual Studio 2010 または 2012 を使用している場合は、注意してください。コンパイラは移動コンストラクターを自動的に生成しません。それは実装されませんでした。したがって、それらを自分で書く必要があります。

于 2012-01-24T18:22:01.787 に答える
6

コンパイラのバグに直面しているに違いありません。標準でBは、暗黙的に宣言および定義された移動コンストラクターを取得すると述べています。12.8(9) のすべての条件が満たされている (つまりB、明示的に宣言されたコピー コンストラクター、コピー代入などがなく、ムーブ コンストラクターが暗黙的に宣言されないdeleted)。

于 2012-01-24T18:24:32.653 に答える