【发布时间】:2020-03-17 23:39:01
【问题描述】:
仅考虑可移动但不可复制的对象(例如std::thread或std::unique_ptr),我想转让所有权 em> 这样的对象包含的资源通过将其作为参数传递给构造函数。我正在比较两种方法:构造函数采用 by value 与 by rvalue reference。
以std::thread 为例,考虑以下类Value,其构造函数采用std::thread按值:
#include <thread>
#include <utility>
struct Value {
Value(std::thread th): th_(std::move(th)) {}
std::thread th_;
};
所有权从参数对象转移到参数对象th,最后转移到数据成员对象th_。
考虑一个类似的类Reference,在这种情况下,它的构造函数通过右值引用获取std::thread:
struct Reference {
Reference(std::thread&& th): th_(std::move(th)) {}
std::thread th_;
};
在这种情况下,所有权直接从参数转移到数据成员对象th_。
据我了解,在按值传递的情况下,参数对象和数据成员对象都是移动构造的,而对于按引用传递的情况,只有数据成员是移动构造的。总而言之,后一种方法似乎更好,因为它只需要一次移动操作,因此效率更高。
但是,是否有任何理由更喜欢按值传递的方法而不是按引用传递的方法?
【问题讨论】:
标签: c++ c++11 parameter-passing move-semantics ownership-semantics