c++ - 我应该如何编写函数参数来执行 move 而不是复制?

标签 c++ c++11 parameters move-semantics

我想使用该类的构造函数将一个大容器从一个返回值 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/

相关文章:

c++ - 如何增加人口/永无止境的循环

c# - 如何在不使用 (?) 符号的情况下将参数传递给 rest web 服务?

sql - 如何在 Hibernate 日志中显示 SQL 参数?

java - 如何知道作为扩展抽象类的参数传递的类

c++ - 构造函数中使用lambda的C++类

c++ - 用空格拆分字符串会导致字符串损坏

c++ - OpenGL boolean 统一?

c++ - 如何在使用 Eigen Library c++ 时删除特定行或列

c++ - 如何检查类型是否属于给定的模板类型

c++ - OS X 上的 libc++ 在哪里?