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?

questionAnswers(1)

yourAnswerToTheQuestion