为什么std :: unique_ptr重设与赋值不同?

明星分子

我想了解为什么

std::unique_ptr<MyClass> p = new MyClass; 

不起作用,但是

std::unique_ptr<MyClass> p;
p.reset(new MyClass);

很好 我有点理解它们的不同之处,但是我想知道为什么选择了使它们与众不同的原因。分配与重置不同有什么危险?

songyuanyao

首先,std::unique_ptr<MyClass> p = new MyClass;不是赋值,而是复制初始化而且它不起作用,因为采用原始指针构造函数std::unique被标记为explicit

explicit unique_ptr( pointer p ) noexcept;

声明为explicit避免意外的(可能是危险的)隐式转换,例如:

void foo(std::unique_ptr<int> uptr);

int *rptr = new int;
foo(rptr); // suppose rptr is implicitly converted to std::unique_ptr<int>
           // then the ownership is passed to the parameter uptr

// when foo() returns uptr is destroyed; the pointer managed by it is deleted too
// since rptr has been deleted continue to deference on it leads to UB
*rptr = 42; // UB

请注意,复制初始化(例如explicit中不考虑构造函数std::unique_ptr<MyClass> p = new MyClass;您可以在直接初始化中使用它们(例如std::unique_ptr<MyClass> p (new MyClass);)。它们用于禁止隐式转换,但是您可以执行显式转换。像使用一样reset,您必须显式地执行这些操作,以表明(并使自己)对自己正在做的事情非常确定。

顺便说一句:原始指针的赋值也不起作用,因为std::unique_ptr没有重载赋值运算符将原始指针作为参数。由于上述原因,原始指针无法隐式转换为std::unique_ptr,因此std::unique_ptr也不会考虑移动分配运算符(作为参数)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

对 std::unique_ptr 数组的赋值

为什么 std::unique_ptr<>.release() 在赋值 lhs 中的成员函数访问之前被评估?

为什么 std::unique_ptr<>.release() 在赋值 lhs 中的成员函数访问之前得到评估?

为什么 std::unique_ptr 与赋值运算符不兼容?

为什么std :: unique_ptr :: reset()总是noexcept?

为什么我需要移动 `std::unique_ptr`

为什么用std :: make_unique代替std :: unique_ptr :: make?

为什么std :: shared_ptr <T> = std :: unique_ptr <T []>可以编译,而std :: shared_ptr <T []> = std :: unique_ptr <T []>不可以编译?

为什么 std::unique_ptr 没有优化而 std::variant 可以?

为什么std :: unique_ptr没有像std :: shared_ptr这样的别名构造函数?

在带有 std::unique_ptr 的类赋值运算符中,

为什么std :: unique_ptr没有const get方法?

为什么std :: unique_ptr不能隐式转换为T *和const T *?

为什么std :: unique_ptr构造函数接受外部指针

为什么std :: unique_ptr构造函数接受外部指针?

为什么我会得到编译错误“使用删除的功能'std :: unique_ptr ...”

为什么我不能在C ++ 14的lambda中移动std :: unique_ptr?

为什么在std :: unique_ptr中没有运算符<<?

为什么std :: unique_ptr不允许类型推断?

为什么std :: unique_ptr没有明确要求noexcept Deleter?

为什么为不完整类型构造std :: unique_ptr?

为什么Google Test / Mock显示std :: unique_ptr泄漏的模拟对象错误?

为什么std :: unique_ptr具有相等运算符?

为什么std :: unique调用std :: sort?

使用std :: unique_ptr <T>&代替std :: unique_ptr <T>有什么优势吗?

使用什么std :: optional或std :: unique_ptr

为什么unique_ptr的auto_ptr有重载?

为什么我不能使用{std :: move(first),std :: move(second)}实例化std :: vector <std :: unique_ptr <int >>?

为什么不推荐使用std :: shared_ptr :: unique()?