Ci scusiamo per il titolo troppo ambiguo. (A causa della mancanza della mia abilità inglese). Si prega di suggerire un titolo migliore.Perché copiare il costruttore non viene richiamato?
Si prega di considerare il seguente codice.
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 non è riuscito a compilarlo con il messaggio di errore error: no matching function for call to 'std::vector<double>::vector(A&)' : a(std::forward<Args>(args)...)
.
Non riesco a capire perché questo codice sia sbagliato. A mio parere, il compilatore dovrebbe invocare il costruttore di copie nella riga A b = a;
.
Tuttavia se sostituisco il costruttore con quello commentato (che prende semplicemente i valori). Compilare. Inoltre, ora non sono necessarie le linee per i costruttori di copia (e spostamento) predefiniti. Cosa succede qui?
Oh, capisco. Grazie per la chiara spiegazione :) – Sungmin