#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?这两种情况都可以成功编译,但我想知道它们之间是否有任何区别。
答案 0 :(得分:4)
不是,因为在这两种情况下,表达式都可以绑定到右值引用。
在第一个中,std::make_unique
已经返回纯净的右值。
在第二个中,std::move
对右值引用进行强制转换,这是多余的。
目标对象是否为空也无关紧要。仅仅调用赋值的行为并不取决于它所接收的引用是如何绑定的。结果将是相同的,目标中的先前(可能不存在的)资源将被来自源的“被盗”替换。
答案 1 :(得分:1)
通过std::make_unique为std::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));