次のコードを見てください。
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 のいずれかをコメントすると (つまり、デストラクタを非仮想にするか、データ メンバーを非揮発性にする)、再びコンパイルされますが、これら 2 つの組み合わせによってコンパイルされないのでしょうか?
もう 1 つのパズル、5 行目ではコンパイル エラーが発生しませんが、6 行目との違いは何ですか? それはすべてgccに固有ですか?または gcc-4.6.1?