看下面的代码:
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?