Adr*_*ian 11 c++ parameters move-semantics c++11
我想使用该类的构造函数将一个大容器从返回值移动到另一个类.如何制定参数以确保它不会被复制?
/* 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
Run Code Online (Sandbox Code Playgroud)
以上公式是否会触发相应的行为,或者我是否需要将构造函数的参数指定为rvalue-references,即容器为自己的移动语义做的方式?
public:
Bar(umap&& m) : bm(m) { }
Run Code Online (Sandbox Code Playgroud)
要么
public:
Bar(umap&& m) : bm(std::move(m)) { }
Run Code Online (Sandbox Code Playgroud)
...?
Ker*_* SB 13
如果要支持移动和复制,最简单的方法是传递值:
Bar(umap m) : bm(std::move(m)) { }
Run Code Online (Sandbox Code Playgroud)
现在你可以Bar从左值和左值构造:
umap m;
Bar b1(m); // copies
Bar b2(std::move(m)); // moves
Bar b3(make_umap()); // moves
Run Code Online (Sandbox Code Playgroud)
如果你只是想支持右值,然后使用一个明确的右值引用:
Bar(umap && m) : bm(std::move(m)) { }
Run Code Online (Sandbox Code Playgroud)
这std::move总是必要的,因为(m)它总是一个左值.