缺少unique_ptr和friends operator = overload

时间:2013-02-17 00:57:05

标签: c++ c++11 std

我知道这种问题在这里并不受欢迎,但我必须问: 为什么unique_ptr / shared_ptr / etc没有类型为T的operator = overload?

似乎更自然
std::unique_ptr<int> p = new int(5);

而不是

std::unique_ptr<int> p(new int(5));

或任何其他更冗长的方法。

2 个答案:

答案 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.