次の簡単なコードを GCC 4.7.2 (MinGW) でコンパイルしようとしています。ここでは、C++11 機能を使用しています - 非静的メンバー初期化子:
#include <iostream>
using namespace std;
struct A
{
int var;
A()
{
cout << "A()\n";
}
A(int i)
{
cout << "A(int i)\n";
var = i;
}
A(const A&) = delete;
};
struct B
{
A a = 7;
};
int main()
{
B b;
cout << "b.a.var = " << b.a.var;
return 0;
}
ここでは不要なコピー コンストラクターが削除されているため、このコードはコンパイルされません。エラーは次のとおりです。
main.cpp:27:11: error: use of deleted function 'A::A(const A&)'
main.cpp:13:5: error: declared here
main.cpp: In constructor 'constexpr B::B()':
main.cpp:25:8: error: use of deleted function 'A::A(const A&)'
main.cpp:13:5: error: declared here
次のようにコピーコンストラクターを実装すると:
A(const A& a)
{
cout << "A(const A&)\n";
var = a.var;
}
その後、コードは正常にコンパイルされ、プログラムは期待される出力を提供します:
A(int i)
b.a.var = 7
つまり、コピー コンストラクターが使用されていないということですが、なぜ削除できないのでしょうか。
編集:回答ありがとうございます。を使用している場合、標準でコンストラクターのコピーまたは移動が必要です=
。この問題を解決するには、ムーブ コンストラクターを実装するか、直接初期化構文を使用する必要がありますA a{7}
。