Stavo verificando il sovraccarico dell'operatore in C++ e ho trovato qualcosa che non mi aspettavo e ho qualche dubbio a riguardo.Errore di compilazione del compilatore di copiatura esplicita
mio costruttore di copia è dichiarata e implementato come come
explicit Vector(const Vector& v);
Vector::Vector(const Vector& v) :
_x(v._x), _y(v._y), _z(v._z) {}
allora sto sovraccaricare gli operatori di assegnazione composti
Vector Vector::operator+(const Vector& v) const
{
Vector tmp(*this);
tmp += v;
return tmp;
}
Vector Vector::operator-(const Vector& v) const
{
Vector tmp(*this);
tmp -= v;
return tmp;
}
tuttavia, nei return
dichiarazioni che ho ottenuto un errore che dice no matching constructor for initialization of 'Vector'
.
Poiché l'unica cosa che ho aggiunto al mio costruttore era la parola chiave explicit
, l'ho cancellata e il codice viene compilato bene, perché?
Ho anche stato il controllo novità da C++ 11 e si è verificato che posso dichiarare il mio costruttore come un movimento costruttore
explicit Vector(const Vector&& v);
e il codice viene compilato bene. Se lo faccio, devo avere sia copia che muovere i costruttori?
explicit Vector(const Vector& v);
explicit Vector(const Vector&& v);
o semplicemente avere il costruttore di spostamenti funzionerà correttamente? Se voglio attenermi a C++ 11, qual è l'approccio corretto da seguire?
possibile duplicato di [Costruttore di copie esplicite] (http://stackoverflow.com/questions/11480545/explicit-copy-constructor) – Predelnik
Molto probabilmente '+ =' e '- =' stanno facendo una copia implicita che causa la errore. – NathanOliver
Non una risposta, ma un commento sul tuo codice. Non vi è alcun motivo per definire un tale costruttore di copia, poiché quelli predefiniti faranno esattamente lo stesso. Di solito c'è anche ragione per dichiarare esplicitamente un costruttore di copia, poiché la sua finalità è di impedire conversioni di tipo implicito. – MikeMB