2017-10-10 24 views
0

私は、std::moveを返信文for exampleに書くことは絶対に注意してきました。いくつかのエッジケースを除いて、for examplestd :: move returnステートメント

私は次のような別の簡単な例があります:std::moveが価値があるかもしれないと思います。しかし、私はなぜ、将来のC++でそれが変わるのか分からないのですか?

#include <iostream> 

struct A 
{ 
}; 

struct C 
{ 
}; 

struct B 
{ 
    B(const A&, const C&) { std::cout << "B was copied\n"; } 
    B(A&&, C&&) { std::cout << "B was moved\n"; } 
}; 

B f() 
{ 
    A a; 
    C c; 
    //return {a, c}; // Gives "B was copied" 
    return {std::move(a), std::move(c)}; // Gives "B was moved" 
} 

int main() { 
    f(); 
    return 0; 
} 
+1

戻ってきたオブジェクトを強制的に移動しようとしているわけではありません。それはアドバイスに関連していません。 – StoryTeller

+5

これらの異なるコンストラクタは、 'B 'が移動またはコピーされることとは関係ありません。 – John

+2

あなたのコードは 'return std :: move(x);'とはまったく異なります。あなたがここに移動するものは実際には戻り値とは無関係です – user463035818

答えて

6
return {std::move(a), std::move(c)} 

あなたは基本的にB::B(A&&, C&&)代わりのバージョンconst&参照を取っを呼び出している

return B{std::move(a), std::move(c)} 

に相当します。これは戻り値の移動とは関係ありません。

この関数の戻り値はの一時的なインスタンスで、のprvalueです。それはC++ 17、それは"guaranteed copy elision"から恩恵を受けるでしょう。 C++ 17の前には、RVOdまたはターゲットに移動します。

関連する問題