2017-12-11 24 views
1
#include <vector> 
using namespace std; 

struct TempData { 
    vector<int> data; 
    TempData() { 
     for(int i = 0; i < 100; i++) data.push_back(i); 
    } 
    // vector<int> GetData() { // function 1 
    // return move(data); 
    // } 
    vector<int>&& GetData() { // function 2 
     return move(data); 
    } 
}; 

int main() { 
    vector<int> v; 
    { 
     TempData td; 
     v = td.GetData(); 
    } 
} 

function 1function 2の違いは何ですか?メンバー関数return rvalueメンバー変数の参照

function 1vectormove(data)で構成し、次にvectorvに割り当てますか?

追加の詳細はありません...

+0

1つの関数は新しいベクトルを返し、もう1つの関数は新しいベクトルを返します。 –

+0

参照修飾子のオーバーロードを考慮する必要があります。 https://stackoverflow.com/questions/21052377/whats-a-use-case-for-overloading-member-functions-on-reference-qualifiers –

+0

これを行う必要がある場合は、オブジェクトを渡すことを検討してください。それを返す必要はありません。 – keith

答えて

2

あなたの小さなテストケースでは違いはありません。余分な一時的なオブジェクトはほぼ確実になくなります。メインのvには、メンバー変数の内容が保持されます。

しかし、一般的なケースでは:

バージョン1 間違いは、いくつかの不特定の「空」の状態でメンバーdataを残します。関数の戻り値が破棄された場合でも

バージョン2 mayメンバーを未指定の空の状態にしておくか、そうでない場合があります。たとえば、関数が呼び出され、戻り値が破棄された場合、メンバーは変更されません。このため、std::move自体は何も動かないと言えるでしょう。

関連する問題