从指针创建unique_ptr

时间:2014-06-14 16:27:05

标签: c++ unique-ptr

以下代码给出错误:

void EntityContainer::AddChild(Entity* child) 
{ 
    unique_ptr<Entity> childPtr(child);
    children.push_back(childPtr);
}

我认为这可能不是为现有对象创建unique_ptr的正确方法。怎么能这样做呢?上面的代码给出了以下错误:

1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\xmemory0(617): error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'

1 个答案:

答案 0 :(得分:11)

您无法复制唯一指针。因为它们是......独特的。但是,您可以移动

children.push_back(std::move(childPtr));

这有点多余,所以你可以说:

children.push_back(std::unique_ptr<Entity>(child));

但是,emplace构造已经提供了容器元素的直接构造:

children.emplace_back(child);

但是,这一切都没有达到标准。问题实际上是你有一个静默取得某事的所有权的功能,并且在界面中完全不可见。所以你真的应该改变功能签名并让调用者明确地给你所有权:

void EntityContainer::AddChild(std::unique_ptr<Entity> child) 
{ 
    children.push_back(std::move(child));
}

如果用户的所有权语义错误,现在不再是你的错!