我知道这种问题在这里并不受欢迎,但我必须问: 为什么unique_ptr / shared_ptr / etc没有类型为T的operator = overload?
写
似乎更自然std::unique_ptr<int> p = new int(5);
而不是
std::unique_ptr<int> p(new int(5));
或任何其他更冗长的方法。
答案 0 :(得分:6)
如果你被允许写这个:
std::unique_ptr<int> p = new int(5);
然后你也可以写下这些:
void Func1(std::unique_ptr<int> p);
Func1(new int(5));
std::unique_ptr<int> Func2() {return new int(5);}
或者更危险:
void Func1(std::unique_ptr<int> p);
int *pInt = new int(5);
Func1(pInt); //You no longer own the pointer anymore.
delete pInt; //You're now deleting a pointer you don't own.
由于显而易见的原因,这是不可接受的。他们不希望从裸指针到唯一指针的隐式转换;如果你想创建一个unique_ptr
,你必须明确它:Func1(std::unique_ptr<int>(pInt));
现在,每个人都可以看到你将所有权从你自己转移到了该功能。
此外,它不是operator=
可以使其有效。它是explicit
的单参数构造函数上的unique_ptr
,它阻止了复制初始化语法的工作。
答案 1 :(得分:2)
您所指的是unique_ptr<T>
的构造函数采用原始T
指针是显式。这是故意的。唯一指针取得所有权,这不应该隐式发生。用户应始终明确知道何时创建,转移和结束所有权。
在一个更严峻的世界中,人们可以想象unique_ptr
根本没有任何原始指针,而只允许直接创建自有对象:
auto p = std::unique_ptr<T>::make(arg1, arg2, arg3);
// Calls "new T(arg1, arg2, arg3)".
// Not real code.