6

C ++では、コピーコンストラクターに副作用がある場合でも、コンパイラーがreturnステートメントの結果であるコピーコンストラクターの呼び出しを省略できるようにする標準の特別な句があるため、returnステートメントから呼び出されるコピーコンストラクターに依存することはできません。したがって、インスタンスのコピー構築以外のことを行うコピーコンストラクタを作成するのは悪いスタイルです。

C ++ 11標準には、特定の状況下でコンパイラーがmoveコンストラクターの呼び出しを排除できるようにする同様のステートメントがありますか?もしそうなら、それらの状況は何ですか?

4

3 に答える 3

9

コピーの省略は、移動の構築にもまったく同じように適用されます。これはまったく同じ条項であり、コピーの省略と移動の構築の両方をまとめて「コピーの省略」と呼びます。

§12.8 [class.copy] p31

特定の基準が満たされると、オブジェクトのコピー/移動コンストラクタおよび/またはデストラクタに副作用がある場合でも、実装はクラスオブジェクトのコピー/移動構築を省略できます。[...]

于 2012-08-03T08:04:36.183 に答える
3

コピー省略が許可されている場合、コピーは実行されないため、オブジェクトが移動可能であっても、移動コピー コンストラクターは呼び出されません。したがって、コピー省略は移動よりも優先され、それがいつ行われるかは (少なくともポータブルな方法では) わかりません。したがって、これは、ムーブ コピーの構築に対する副作用が悪い考えである場合の 1 つのシナリオです。

于 2012-08-03T08:05:15.710 に答える
1

省略は、コピーと移動の両方で同じように定義されます。規格には、同じように定義されているため、move に関する特定の用語はありません。

于 2012-08-03T08:09:02.207 に答える