Посмотрите на следующий код:
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, она компилируется отлично, это ясно. Код компилируется без опции С++ 0x, поэтому ошибка связана с конструктором перемещения по умолчанию.
Однако, что в классе node предотвращает создание конструктора перемещения по умолчанию? Если я прокомментирую какую-либо из строк # 3 или # 4 (т.е. Сделайте деструктор не виртуальным или сделайте элемент данных нелетучим), он снова скомпилируется, так же как и комбинация этих двух делает невозможным компиляцию?
Еще одна головоломка, строка # 5 не вызывает ошибку компиляции, что отличает ее от строки # 6? Это все специфично для gcc? или gcc-4.6.1?