Guardate il seguente codice:In che modo il costruttore di movimento sintetizzato C++ è interessato da membri volatili e virtuali?
struct node
{
node();
//node(const node&); //#1
//node(node&&); //#2
virtual //#3
~node();
node*
volatile //#4
next;
};
int main()
{
node m(node()); //#5
node n=node(); //#6
}
Quando compilato con gcc-4.6.1 che produce il seguente errore:
g++ -g --std=c++0x -c -o node.o node.cc
node.cc: In constructor node::node(node&&):
node.cc:3:8: error: expression node::next has side-effects
node.cc: In function int main():
node.cc:18:14: note: synthesized method node::node(node&&) first required here
Mi pare di capire che il compilatore non riesce a creare movimento predefinito o costruttore di copia su linea # 6, se disapprovo o la riga n. 1 o n. 2 compila bene, è chiaro. Il codice viene compilato correttamente senza l'opzione C++ 0x, quindi l'errore è correlato al costruttore di mosse predefinito.
Tuttavia, che cosa nella classe nodo impedisce la creazione del costruttore di spostamento predefinito? Se commento qualcuna delle righe # 3 o # 4 (cioè rende il distruttore non virtuale o rende non-volatile il membro dei dati), ricompila, quindi è la combinazione di questi due che non lo fa compilare?
Un altro enigma, la riga n. 5 non causa un errore di compilazione, cosa c'è di diverso dalla riga n. È tutto specifico per gcc? o gcc-4.6.1?
Hai dimenticato il tipo di ritorno di 'main' là skippy –