これは、移動コンストラクターの暗黙的な生成をまったく望まない人と、ほとんどの状況で移動コンストラクターを自動的に生成することを望んでいる人の2つの極端な状況の間の妥協点であることを思い出しているようです。
移動コンストラクターの暗黙的な生成を望まない人々の中で、DaveAbrahamsはImplicitMoveMustGoという記事を書きました。ある状況下では、メンバーが移動可能であっても、moveコンストラクターの暗黙的な生成によって不変条件が壊れる可能性があるという理論的根拠があります。
今年(2011年)の初めに、委員会は、安全性の問題よりも既存のコードのパフォーマンスの向上を強調しているように見える決定で、moveコンストラクターの暗黙的な生成を維持することを決定しました( 1 )。決定の詳細、賛否両論については話していませんが、結果にも満足していません。
編集(Jerry Coffinから):移動コンストラクターの暗黙的な宣言の条件のリストは次のとおりです。
If the definition of a class X does not explicitly declare a move constructor,
one will be implicitly declared as defaulted if and only if
— X does not have a user-declared copy constructor,
— X does not have a user-declared copy assignment operator,
— X does not have a user-declared move assignment operator,
— X does not have a user-declared destructor, and
— the move constructor would not be implicitly defined as deleted.
基本的な考え方は、これらのいずれかをクラスに含めることは、暗黙的に生成されたmovectorが誤動作する可能性が高いことを示しているということです。それは事実ですが、リスト内の条件は決定に必要でも十分でもないため、有用であったはずの多くのムーバーが生成されず、問題を引き起こす多くのムーバーが生成される可能性があります。さらに悪いことに、ルールはすでに長く複雑であるため、すべてを覚えている人はほとんどいません。ルールを修正すると、おそらく少なくとも2倍になります。
[ジェリーの貢献/暴言の終わり]
(1)決定が下された理由についての洞察を与えてくれたGeneBushuyevに感謝します