我想使用该类的构造函数将一个大容器从一个返回值 move 到另一个类中。如何制定参数以确保它最终不会被复制?
/* for the sake of simplicity, imagine this typedef to be global */
typedef std::unordered_map<std::string, unsigned int> umap;
umap foo()
{
umap m; /* fill with lots of data */
return m;
}
class Bar
{
public:
Bar(umap m) : bm(m) { }
private:
umap bm;
};
Bar myBar(foo()); // run foo and pass return value directly to Bar constructor
上面的公式是否会触发适当的行为,或者我是否需要将构造函数的参数指定为右值引用,就像容器为自己的 move 语义所做的那样?
public:
Bar(umap&& m) : bm(m) { }
或
public:
Bar(umap&& m) : bm(std::move(m)) { }
...?
最佳答案
如果你想支持 move 和复制,最简单的方法是to pass by value :
Bar(umap m) : bm(std::move(m)) { }
现在您可以从左值和右值构造Bar
:
umap m;
Bar b1(m); // copies
Bar b2(std::move(m)); // moves
Bar b3(make_umap()); // moves
如果您只想支持右值,那么使用显式右值引用:
Bar(umap && m) : bm(std::move(m)) { }
std::move
始终是必需的,因为 (m)
始终是左值。
关于c++ - 我应该如何编写函数参数来执行 move 而不是复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21004838/