6

関数があるとしましょう:

typedef std::vector<int> VecType;
VecType randomVector();

int processing()
{
    VecType v = randomVector();
    return std::accumulate(v.begin(), v.end(), 0);
}

C++0x は、偽のコピーが randomVector の戻り値から回避されると具体的に言っていますか? それとも、コンパイラは RVO を実装する必要がありますか? 値randomVector()を右辺値として扱う必要があるため、v の移動コンストラクターを呼び出す必要があるように思えますが、これが正しいかどうかは完全にはわかりません。

4

2 に答える 2

7

ルールは次のとおりです

  • コンパイラが RVO を実行できる場合は、その実行が許可され、コピーも移動も行われません。
  • それ以外の場合は、適切なコンストラクターが使用されます。

あなたが言うように、一時的なものは右辺値であるため、移動コンストラクターが選択され13.3.3.2/3ます。これは、右辺値参照が左辺値参照よりも適切に右辺値にバインドされるというルールのためです。move コンストラクターと copy コンストラクターのどちらを使用するかを決定する際に、オーバーロードの解決では move コンストラクターが優先されます。

コンパイラが RVO を実行できるという規則は に書かれてい12.8/15ます。

于 2009-08-22T21:15:07.063 に答える
2

すべての戻り値はrvaluesそうであると見なされます。この場合、コンパイラが RVO を実装しない場合、コピー コンストラクタではなく移動コンストラクタを使用する必要があります。

于 2009-08-23T06:09:49.267 に答える