非常にあいまいなタイトルで申し訳ありません.(私の英語力がないため). より良いタイトルを提案してください。
次のコードを検討してください。
struct A {
typedef std::vector<double> State;
// template <class... Args>
// A(Args... args)
// : a(args...)
// {}
template <class... Args>
A(Args&&... args)
: a(std::forward<Args>(args)...)
{}
A(const A&) = default;
A(A&&) = default;
State a;
};
int main(){
A a(3,2);
A b = a; // This line triggers an error!!
}
Gcc 4.8.0 はコンパイルに失敗し、エラー メッセージが表示され
error: no matching function for call to 'std::vector<double>::vector(A&)' : a(std::forward<Args>(args)...)
ました。
このコードが間違っている理由がわかりません。私の意見では、コンパイラは行でコピー コンストラクタを呼び出す必要がありますA b = a;
。
ただし、コンストラクターをコメント化されたもの (単に値を取る) に置き換えると、コンパイルします。さらに、デフォルトのコピー (および移動) コンストラクターの行が不要になりました。そこで何が起こるの?