所以我正在读一本关于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_ptr
;unique_ptr
不可复制,因此出现错误。
将lambda表达式更改为以下内容:
[&] (Ptr const& p) -> bool { return p.get() == &node; }
// ^^^^^^
// take the argument by reference and avoid copying