Przepraszamy za zbyt dwuznaczny tytuł (z powodu braku moich umiejętności językowych). Zaproponuj lepszy tytuł.Dlaczego kopiowanie konstruktora nie jest wywoływane?
Proszę wziąć pod uwagę następujący kod.
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 nie skompilować z komunikatem o błędzie error: no matching function for call to 'std::vector<double>::vector(A&)' : a(std::forward<Args>(args)...)
.
Nie mogę zrozumieć, dlaczego ten kod jest nieprawidłowy. Moim zdaniem, kompilator powinien wywołać konstruktora kopii w linii A b = a;
.
Jednak jeśli zamieniam konstruktor na skomentowany (który po prostu przyjmuje wartości). Kompiluje. Co więcej, teraz linie dla domyślnych konstruktorów kopiowania (i przenoszenia) nie są potrzebne. Co się tutaj dzieje?
Och, rozumiem. Dzięki za jasne wyjaśnienie. :) – Sungmin