![](/img/trans.png)
[英]Why move return an rvalue reference parameter need to wrap it with std::move()?
[英]Pass by rvalue reference and return using std::move()?
考慮:
struct Foo {
Foo () { std::cout << "default ctor" << std::endl; }
Foo (const Foo&) { std::cout << "copy ctor" << std::endl; }
Foo& operator= (const Foo&) { std::cout << "copy op" << std::endl; return *this; }
Foo (Foo&&) { std::cout << "move ctor" << std::endl; }
Foo& operator= (Foo&&) { std::cout << "move op" << std::endl; return *this; }
~Foo () { std::cout << "dtor" << std::endl; }
};
Foo process1 (Foo&& foo) {
return foo;
}
Foo process2 (Foo&& foo) {
return std::move (foo);
}
和用法:
Foo foo {};
foo = process1 (std::move (foo));
給出結果:
default ctor
copy ctor
move op
dtor
dtor
和用法:
Foo foo {};
foo = process2 (std::move (foo));
給出結果:
default ctor
move ctor
move op
dtor
dtor
首選哪一個(process1或process2)?
這是否意味着在第一個示例(process1)中,如果我通過右值引用將對象傳遞給該函數,該函數返回一個Object,如果我不使用std::move()
,將進行復制?
編譯器:GCC 5.2.1
在第一個版本中
Foo process1 (Foo&& foo) {
return foo;
}
您將其作為右值引用傳遞,但是通過“如果它具有名稱”試探法 ,它將在函數中被視為左值,因此被視為復制ctor。
第二個版本使用std::move
“重制”它為一個右值(這正是它的目的)。 因此避免了復制控制器。
可以預期,遷移的成本不會比復制的成本高,因此,考慮到現實生活中的情況,您可能更喜歡第二個版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.