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

LLVM find_if implicitly-deleted copy constructor with unique_ptr<>

本文关键字:具有 unique ptr lt gt 复制 if find 删除 LLVM 构造函数      更新时间:2023-10-16

所以我正在读一本关于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’的复制构造函数"

在LLVM中隐式删除复制构造函数的调用中有一个相关的问题,但在我的情况下,答案没有多大意义。

需要注意的是,我正在使用最新的Xcode5版本进行开发。

find_if调用中的lambda表达式通过获取Ptr(也称为unique_ptr<SceneNode>)参数,这意味着它正在尝试复制unique_ptrunique_ptr不可复制,因此出现错误。

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

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