33

このコードを考えてみましょう:

#include <iostream>
using namespace std;

void Func(int&& i) {
    ++i;
}

int main() {
    int num = 1234;
    cout << "Before: " << num << endl;
    Func(std::move(num));
    cout << "After: " << num << endl;
}

その出力は次のとおりです。

Before: 1234
After: 1235

明らかに、によってr値参照に「変換」された後、パラメータにバインドされるため、i内部で変更されています。Funcistd::move

さて、私のポイント:

オブジェクトの移動とは、あるオブジェクトから別のオブジェクトにリソースの所有権を譲渡することを意味します。ただし、組み込み型はそれ自体がリソースであるため、リソースを保持しません。彼らが保持しているリソースを転送することは意味がありません。例に示すように、numの値が変更されます。そのリソース、その自己は、変更されているものです。

組み込み型には移動セマンティクスがありますか?

また、組み込み型オブジェクトは、移動後(存在する場合)、明確に定義された動作をしますか?

4

1 に答える 1

57

それで、例で示されているものは明確に定義された動作ですか?

はい、例に示されている動作は、標準で許可されている唯一の動作です。std::move動かないからです。移動するのは、移動コンストラクターと移動代入演算子です。

std::move左辺値をx値に変更するだけで、右辺値参照にバインドできます。コンストラクターなどは呼び出されません。値のカテゴリの変更は、タイプレベルで行われます。実行時には何も起こりません。

右辺値参照は引き続き参照です。元のオブジェクトを参照します。この関数は、指定された参照を介して元の整数をインクリメントします。

関数が参照によって引数を取る場合、コピーも移動も発生しません。元のオブジェクトは参照にバインドされます。

関数が値で引数を取る場合、移動する可能性があります。

ただし、基本型には移動コンストラクターがありません。その場合、移動はコピーに低下します。

于 2013-02-04T03:03:53.203 に答える