ので、移動のコンストラクタ:どのように暗黙的に生成された移動コンストラクタはC++で動作しますか?
foo(foo &&)
は、暗黙的にC++プログラムで生成されます。なぜパラメータデータ型の隣に二重のアンパサンドが必要なのか、私は静かではない。私は二重のアンパサンドは右辺値への参照を意味することを理解していますが、それがこの文脈にどのように適用できるかわかりません。
ので、移動のコンストラクタ:どのように暗黙的に生成された移動コンストラクタはC++で動作しますか?
foo(foo &&)
は、暗黙的にC++プログラムで生成されます。なぜパラメータデータ型の隣に二重のアンパサンドが必要なのか、私は静かではない。私は二重のアンパサンドは右辺値への参照を意味することを理解していますが、それがこの文脈にどのように適用できるかわかりません。
移動コンストラクタの目的は、コピーのコストを節約するために、とにかく破壊しようとしているオブジェクトのリソースの所有権を取得することです。とにかく破壊されようとしているオブジェクトはr値です。したがって、移動コンストラクタのパラメータタイプはr値への参照です。
他に何がありますか?これはl値参照ではありません。コピーコンストラクタです。それは、コピーコンストラクタを呼び出すことになり(また、あいまいである)、移動コンストラクタの全目的を破ってしまうため、価値を得ることはできません。
はい、そのオブジェクトの所有権を取得するには、新しい参照が新しいメモリ空間を占めるようにアドレスが必要です。しかし、私はrvalueの定義を誤解しているかどうかはわかりません。右辺値は単に=演算子の左側に割り当てることができない値です(例:int a = b * c)。 b * cは値であり、この場合、あなたが「とにかく破壊しようとしているオブジェクトはr値です」と言うと、あなたの主張は理にかなっていると思います。なぜなら、b * aは代入文の直後に破棄されるように見えるからです。 –
あなたはオブジェクトの所有権を取っていません。つまり、内部のものを食い止めているからです。 rvalueの考え方はちょっとrvalue参照と少し混乱するかもしれません:Rvalue参照は***ではありません。rvalues ***。 Rvalue参照は、一部の操作から返された一時オブジェクトの存続期間を延長するために使用されます。 – TheKitchenSink
どのようなパラメータが必要ですか? –
r値参照は、移動セマンティクスが再生される場所から移動できます。移動してコピーすることが何を意味するのか理解していませんか? – Chad
私はそうすると思います。 Copyはパラメータオブジェクトの正確なコピーを作成しますが、moveはコピーを作成せずにパラメータオブジェクトのアドレスを転送し、現在の参照を破棄します。 –