将make_unique指定为std :: move()是否为空unique_ptr?

时间:2018-01-18 13:13:08

标签: c++

#include <memory>
using namespace std;

int main()
{
    unique_ptr<int> a;

    // Do something....

    // Case 1
    a = make_unique<int>(5);

    // Case 2
    a = std::move(make_unique<int>(5));

    return 0;
}

我真正要问的是:

是否需要std :: move将临时unique_ptr分配给空的unique_ptr?这两种情况都可以成功编译,但我想知道它们之间是否有任何区别。

3 个答案:

答案 0 :(得分:4)

不是,因为在这两种情况下,表达式都可以绑定到右值引用。

在第一个中,std::make_unique已经返回纯净的右值。

在第二个中,std::move对右值引用进行强制转换,这是多余的。

目标对象是否为空也无关紧要。仅仅调用赋值的行为并不取决于它所接收的引用是如何绑定的。结果将是相同的,目标中的先前(可能不存在的)资源将被来自源的“被盗”替换。

答案 1 :(得分:1)

通过std::make_uniquestd::move指针分配值时,您不需要使用std::unique_ptr。这适用于初始化:

std::unique_ptr<int> a = std::make_unique<int>(5);

和作业:

std::unique_ptr<int> a;
a = std::make_unique<int>(5);

实施已经为您做了转发:

return std::unique_ptr<T>(new T(std::forward<Args>(args)...));

答案 2 :(得分:1)

  

make_unique需要std::move()分配给 unique_ptr吗?

没有必要为空,做:

a = make_unique<int>(5);

相当于:

a.reset(make_unique<int>(5));

也就是说,a所拥有的对象(如果有的话)被make_unique创建的新对象替换(在被释放之后)。

  

std::move 是否需要将临时unique_ptr分配给空unique_ptr

make_unique返回的内容:

a = make_unique<int>(5);

已经是左值。因此,需要使用std::move(),如下面的代码所示:

a = std::move(make_unique<int>(5));