コピーまたは移動コンストラクタを持たない別のクラスの配列メンバ( "C配列")を持つクラスを作成したいと思います。残念なことに、コンパイラは私に内部クラスの移動コンストラクタが必要であることを伝えるエラーメッセージを表示します。私は、コンパイル時に指定されたサイズの配列が必要な理由を理解していません。私にとってさらに奇妙なのは、配列がクラスメンバではなく自動スタック変数である場合、コンパイラは不平を言っていないということです。 次のコードは私の問題を示しています。これはコンパイルされ、最初の行(つまり、コンストラクタを使用して)で期待通りに実行されます。出力には、ムーブコンストラクタが呼び出されないことが示されます。しかし、最初の行がコメントアウトされた状態では、27行目(配列は別の構造体のメンバ変数)にエラーメッセージが表示されますが、37行目(配列変数は配列変数)はコンパイルされます。 この例のように、初期化子リストを使用してタイプAの配列要素を構築したいとします。クラスの配列メンバーに必要な移動
#define WITH_MOVE_CTOR
#include <iostream>
using namespace std;
struct A {
A(int i, bool b) : mi(i), mb(b)
{ }
A(A&&s)
#ifdef WITH_MOVE_CTOR
: mi(s.mi),mb(s.mb)
{ cout << s << "move ctor called\n"; }
#else
= delete;
#endif
A() = delete;
A(const A&) = delete;
A& operator=(const A&) = delete;
friend ostream & operator<<(ostream & in, const A&a)
{ return in << a.mi << "," << a.mb; }
void foo() const { cout << *this << " foo called\n"; }
int mi;
bool mb;
};
struct CA {
CA() : m({{1, true},{2, false}}) {}
CA(const A&) = delete;
CA(A&&) = delete;
CA& operator=(const CA&) = delete;
A m[2];
};
int main()
{
cout << "C-array:\n";
A ca[2] = {{1, true},{2, false}};
ca[1].foo();
cout << "C-array in struct:\n";
CA sca;
sca.m[1].foo();
return 0;
}
出力:それは場所に構築していますので、
C-array:
2,0 foo() called
C-array in struct:
2,0 foo() called
{{1、true}、{2、false} {} ' –
中括弧を省略すると問題は解決します。ありがとうございます! – Stefan
@Kerrek SBコンパイラが中カッコで何をするのか説明できますか?実行時に少なくとも結果は同じです。 e。移動コンストラクタは呼び出されません。 – Stefan