gpt4 book ai didi

c++ - 为什么 std::unique_ptr 重置与赋值不同?

转载 作者:可可西里 更新时间:2023-11-01 14:55:54 30 4
gpt4 key购买 nike

我想知道为什么

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

没有效果,但是

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

很好。我有点理解它们的不同之处,但我想知道为什么选择让它们不同。 assignment 和 reset 不一样有什么危险?

最佳答案

首先,std::unique_ptr<MyClass> p = new MyClass;不是赋值,是copy initialization .它不起作用,因为 constructor of 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 copy initialization 中不考虑构造函数(例如 std::unique_ptr<MyClass> p = new MyClass; )。您可以在 direct initialization 中使用它们相反(例如 std::unique_ptr<MyClass> p (new MyClass); )。它们用于禁止隐式转换,但您可以执行显式转换。喜欢 reset 的用法,你必须明确地做这些事情,以表明(并让你自己)你对自己正在做的事情非常确定。

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

关于c++ - 为什么 std::unique_ptr 重置与赋值不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50146366/

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