LLVM find_if带有unique_ptr<>的隐式删除的复制构造函数

时间:2014-04-14 22:37:23

标签: c++ xcode c++11 llvm unique-ptr

所以我正在编写一本关于使用SFML和C ++ 11进行游戏开发的书,并且用于创建场景树的代码行之一给我带来了麻烦,这在我看来有点过头了。由于find_if算法中unique_ptr的隐式删除的复制构造函数,编译器返回错误。

这是find_if调用的函数。 Ptr是std::unique_ptr<SceneNode>的typedef。这是我目前使用find_if的唯一地方。

SceneNode::Ptr SceneNode::detachChild(const SceneNode& node) {
    auto found = std::find_if(mChildren.begin(), mChildren.end(), [&] (Ptr p) -> bool { return p.get() == &node; });

    assert(found != mChildren.end());

    Ptr result = std::move(*found);
    result->mParent = nullptr;
    mChildren.erase(found);
    return result;
}

返回的错误在算法本身中提出,并且特别是“调用'Ptr'的隐式删除的复制构造函数。”

Call to implicitly deleted copy constructor in LLVM有一个相关问题,但答案在我的案例中没有多大意义。

作为一个注释,我正在使用最新的Xcode 5版本进行开发。

1 个答案:

答案 0 :(得分:2)

find_if调用中的lambda表达式通过 value 获取Ptr(又名unique_ptr<SceneNode>)参数,这意味着它正在尝试复制unique_ptr; unique_ptr是不可复制的,因此是错误。

将lambda表达式更改为以下内容:

[&] (Ptr const& p) -> bool { return p.get() == &node; }
//       ^^^^^^
// take the argument by reference and avoid copying