从指针创建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.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));
}

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

相关内容

  • 没有找到相关文章

最新更新