我想将a传递std::unique_ptr
给一个类的构造函数,该类将获取拥有的数据的所有权std::unique_ptr
。
在编译器处理它们的方式方面foo
,bar
下面的方法与下面的方法是否有任何区别,从而使其中一种更可取?
foo
类:
template <class T>
class foo
{
std::unique_ptr<T> data_;
public:
foo(std::unique_ptr<T>&& data) :
data_{ std::forward<std::unique_ptr<T>>(data) }
{
}
};
bar
类:
template <class T>
class bar
{
std::unique_ptr<T> data_;
public:
bar(std::unique_ptr<T> data) :
data_{ std::move(data) }
{
}
};
绑定到引用只需少走一走:
void f(std::unique_ptr<T>&& p) { g(std::move(p)); }
f(std::make_unique<T>()); // no move, g binds directly to the temporary
绑定到对象参数需要一个实际步骤:
void f(std::unique_ptr<T> p) { g(std::move(p)); }
f(std::make_unique<T>()); // p constructed (= moved) from temporary,
// g binds to p
额外的操作涉及一个指针副本,一个将指针设置为null以及一个带有条件检查的析构函数。这并不是很大的代价,使用哪种样式的问题取决于您编写的代码类型:
您的代码叶子越多,使用的代码就越少,带有按值传递的简单版本越能使您变得简单。相反,您的代码库越多,对用户的了解就越少,无论施加多小的开销,其所带来的价值都不会增加。
你决定。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句