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

时间:2017-04-05 14:27:30

标签: c++ c++11

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

1 个答案:

答案 0 :(得分:5)

绑定到引用需要少一点动作:

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的指针设置,以及一个带有条件检查的析构函数。这不是一个很大的成本,使用哪种风格的问题取决于你正在编写的代码类型:

代码越多,使用的越少,带有按值传递的简单版本就越简单。相反,您的代码库越多,您对用户的了解就越少,无论多么小,都不会产生可避免的成本。

你决定。