我应该如何编写函数参数来强制执行移动而不是复制?

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)它总是一个左值.