Como o construtor de movimento sintetizado em C ++ é afetado por membros voláteis e virtuais?
Veja o seguinte código:
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 compilado com o gcc-4.6.1, produz o seguinte erro:
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
Pelo que entendi, o compilador falha ao criar o construtor padrão de cópia ou cópia na linha 6, se eu remover o comentário da linha 1 ou 2 é bem claro, isso é claro. O código compila bem sem a opção c ++ 0x, portanto, o erro está relacionado ao construtor de movimento padrão.
No entanto, o que na classe de nó impede que o construtor de movimentação padrão seja criado? Se eu comentar qualquer uma das linhas # 3 ou # 4 (ou seja, tornar o destrutivo não-virtual ou tornar o membro de dados não-volátil) ele compila novamente, então a combinação desses dois faz com que não compile?
Outro quebra-cabeça, a linha 5 não causa um erro de compilação, o que é diferente da linha 6? É tudo específico para o gcc? ou gcc-4.6.1?