gpt4 book ai didi

c++ - 将 std::unique_ptr 传递给构造函数以获取所有权

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:08 24 4
gpt4 key购买 nike

我想将 std::unique_ptr 传递给一个类的构造函数,该类将获得 std::unique_ptr 所拥有的数据的所有权。

下面的方法 foobar 在编译器处理它们的方式方面是否有任何差异,从而使其中之一更可取?

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) }
{
}
};

最佳答案

绑定(bind)到引用需要少一步:

void f(std::unique_ptr<T>&& p) { g(std::move(p)); }

f(std::make_unique<T>()); // no move, g binds directly to the temporary

绑定(bind)到一个对象参数需要一个实际的 Action :

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

额外的移动涉及一个指针拷贝、一个指向空的指针设置和一个带有条件检查的析构函数。这不是一个很大的成本,使用哪种样式的问题取决于您编写的代码类型:

您的代码的叶子越多,使用的越少,具有按值传递的简单版本越能为您带来简单性。相反,您的代码库越多,您对用户的了解越少,不强加可避免的成本(无论多小)的值(value)就越大。

你来决定。

关于c++ - 将 std::unique_ptr 传递给构造函数以获取所有权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43234083/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com