Как на C ++ синтезированный конструктор ходов влияют изменчивые и виртуальные члены?

Посмотрите на следующий код:

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
}

При компиляции с gcc-4.6.1 выдает следующую ошибку:

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

Как я понимаю, компилятору не удается создать конструктор перемещения или копирования по умолчанию в строке № 6, если я раскомментирую строку № 1 или № 2, он компилируется нормально, это ясно. Код прекрасно компилируется без опции c ++ 0x, поэтому ошибка связана с конструктором перемещения по умолчанию.

Однако что в классе узла препятствует созданию конструктора перемещения по умолчанию? Если я прокомментирую какую-либо из строк № 3 или № 4 (то есть сделаю деструктор не виртуальным или сделаем элемент данных энергонезависимым), он снова скомпилирует, так что комбинация этих двух не позволяет его компилировать?

Другая загадка, строка № 5, не вызывает ошибку компиляции, чем отличается от строки № 6? Это все специфично для gcc? или gcc-4.6.1?

Ответы на вопрос(1)

Ваш ответ на вопрос