2017-02-24 10 views
7
#include <vector> 

using namespace std; 

struct A 
{ 
    A(const vector<int>&) {} 
    A(vector<int>&&) {} 
}; 

A f() 
{ 
    vector<int> coll; 
    return A{ coll }; // Which constructor of A will be called as per C++11? 
} 

int main() 
{ 
    f(); 
} 

collxvaluereturn A{ coll };であるか?C++ 11は、return文のローカル変数をコピーするのではなく移動することを保証しますか?

C++ 11保証A(vector<int>&&)はときfリターンと呼ばれるのか?

+0

あなたの例では、 'A {coll}'は呼び出し元コンテキストで構築され、コンストラクタ 'A(const vector&)'を使用します。 – Oliv

答えて

11

C++ 11では、collの移動が許可されていません。 return <identifier>を実行すると、returnステートメントでの暗黙的な移動のみが許可されます。ここで、<identifier>はローカル変数の名前です。それよりも複雑な式は暗黙的に移動しません。

より複雑な表現は、ではありません。は、どのような形のelisionも受けます。

+4

+1; ''のタイプがreturn'dタイプと一致しなかった場合、どこに移動しなかったのかという点で、そこには注意が必要です。これは、欠陥報告かC++ 14の変更のいずれかで修正されました。しかし、レガシーコンパイラを使用している(またはリスクを使用している)場合、型が正確に一致しない場合は 'move'が賢明です(そしてコストはかかりません)。一方、型が正確に一致すると、 'move'はelisionをブロックします。これは比較的古いコンパイラを使用している場合にのみ問題になります。 – Yakk

+0

@vsoftco:ああ、*式*は価値があり、そのように振る舞います。しかし、「coll」は「A」には移動しません。それが質問の内容です。 –

+0

@NicolBolasありがとう!はい、私はコメントを書いた後に実現しました。最初は「A」には動きがあり、その問題は「A」オブジェクトそのものに関するものだと思っていました。 – vsoftco

関連する問題