Stavo ricevendo uno strano errore da gcc e non riesco a capire perché. Ho creato il seguente codice di esempio per rendere più chiaro il problema. Fondamentalmente, c'è una classe definita, per la quale io faccio il suo costruttore di copia e l'operatore di assegnazione delle copie privato, per evitare di chiamarli accidentalmente.vector :: push_back insiste sull'uso del costruttore di copie anche se viene fornito un costruttore di spostamenti
#include <vector>
#include <cstdio>
using std::vector;
class branch
{
public:
int th;
private:
branch(const branch& other);
const branch& operator=(const branch& other);
public:
branch() : th(0) {}
branch(branch&& other)
{
printf("called! other.th=%d\n", other.th);
}
const branch& operator=(branch&& other)
{
printf("called! other.th=%d\n", other.th);
return (*this);
}
};
int main()
{
vector<branch> v;
branch a;
v.push_back(std::move(a));
return 0;
}
Mi aspetto che questo codice venga compilato, ma non riesce con gcc. In realtà gcc lamenta che "branch :: branch (const ramo &) è privato", che come ho capito non dovrebbe essere chiamato.
L'operatore di assegnazione funziona, dal momento che se sostituisco il corpo di main() con
branch a;
branch b;
b = a;
Sarà compilato ed eseguito come previsto.
È un comportamento corretto di gcc? Se è così, cosa c'è di sbagliato nel codice sopra? Qualsiasi suggerimento mi è utile. Grazie!
Funziona per me con gcc-4.6.1. –
Stavo usando gcc 4.7.1-2. Proverò 4.6.1. Grazie! – BreakDS
Con la mia lettura di N3242, questo codice dovrebbe essere consentito (ma se il costruttore di move lancia un'eccezione, il programma ha un comportamento non definito). – aschepler