ルック: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
を私は行#1または#2のいずれかをコメント解除する場合、それは罰金をコンパイルする、それは明らかです。コードは、C++ 0xオプションなしで正常にコンパイルされるため、エラーはデフォルトの移動コンストラクタに関連しています。
しかし、ノードクラスではデフォルトの移動コンストラクタを作成できません。 #3または#4の行のいずれかにコメントすると(つまり、デストラクタを非仮想にするか、データメンバを不揮発にする)、再びコンパイルします。したがって、これら2つの組み合わせによってコンパイルされませんか?
もう1つのパズル、ライン#5はコンパイルエラーを起こさない、ライン#6とは何ですか? gccではすべて固有ですか? gcc-4.6.1?
あなたは 'main'の復帰型skippyを忘れました –