下面的代码给出了一个错误:
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.0vcincludexmemory0(617): error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
不能复制唯一指针。因为他们是……独一无二的。但是,您可以移动它们:
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));
}
现在如果用户得到错误的所有权语义不再是你的错!