如何将std::find_if中使用原始指针的lambda修改为适配std::unique_ptr的实现
报错原因分析
- 第一次报错原因:你给lambda设置的形参是
GraphNodeUniquePtr node,属于值传递,调用时会触发std::unique_ptr的拷贝构造函数,但unique_ptr是独占所有权的智能指针,拷贝构造函数被显式删除,因此编译报错。 - 第二次报错原因:你将
id封装为unique_ptr并通过移动语义捕获到lambda中后,lambda本身会因为持有不可拷贝的unique_ptr成员,变为不可拷贝类型。而STL算法std::find_if要求传入的可调用对象必须支持拷贝构造,因此触发新的编译错误。
解决方案
完全不需要修改id的捕获逻辑,只需要将lambda的形参改为常量引用即可,避免对unique_ptr做拷贝操作,同时保留unique_ptr的独占所有权特性,正确代码如下:
int id = std::stoi(idToken->second); auto newNode = std::find_if(_nodes.begin(), _nodes.end(), [&id](const GraphNodeUniquePtr& node) { return node->GetID() == id; });
补充说明:用const引用传递unique_ptr不会转移所有权,只是临时借用访问权限,完全符合独占所有权的要求。且unique_ptr重载了->运算符,直接调用node->GetID()和原始指针用法一致,不需要额外调用get()方法。
内容的提问来源于stack exchange,提问作者João Lucas Gouveia
相关产品推荐
相关产品推荐

