std::move
通常,rvalues是无法通过解除引用来获取其地址的值,因为它们是文字或因为它们本质上是临时的(例如函数或显式构造函数调用返回的值)。 通过将对象传递给此函数,可以获得引用它的rvalue。
标准库的许多组件实现移动语义,允许直接转移对象的资产和属性的所有权,而无需在参数为右值时复制它们。
虽然注意到移动意味着移动的对象保持有效但未指定的状态。 这意味着,在这样的操作之后,移动对象的值应该只被销毁或分配一个新值; 访问它否则会产生一个未指定的值。
看下面一个例子:
// move example
#include <utility> // std::move
#include <iostream> // std::cout
#include <vector> // std::vector
#include <string> // std::string
int main () {
std::string foo = "foo-string";
std::string bar = "bar-string";
std::vector<std::string> myvector;
myvector.push_back (foo); // copies
myvector.push_back (std::move(bar)); // moves
std::cout << "myvector contains:";
for (std::string& x:myvector) std::cout << ' ' << x;
std::cout << '\n';
return 0;
}
输出:
myvector contains: foo-string bar-string