Как на 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?