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 コンストラクターを使用するテンプレート クラスがあるため、これを基本クラスから修正できないと非常に不便です。私のテンプレート クラスで使用するための要件ではありません)、明示的に定義された移動コンストラクターを持つ必要があります。