lambda表达式内部的引用出现问题



我试图将一个原始指针实现替换为智能指针,所以在这个函数中调用

int id = std::stoi(idToken->second);
auto newNode = std::find_if(_nodes.begin(), _nodes.end(), [&id](GraphNode *node) { return node->GetID() == id; });

我试图将原始指针(GraphNode(更改为GraphNode唯一ptr,以将GraphNode的独占所有权设置为它所声明的类,因此在它的声明中,我更改为

typedef std::unique_ptr<GraphNode> GraphNodeUniquePtr;
std::vector<GraphNodeUniquePtr> _nodes;

在函数调用中,我放入

int id = std::stoi(idToken->second);
auto newNode = std::find_if(_nodes.begin(), _nodes.end(), [&id](GraphNodeUniquePtr node){ return node.get()->GetID() == id; });

编译时,编译器抛出错误

error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = GraphNode; _Dp = std::default_delete<GraphNode>]’

然后我想可以制作一个id为的唯一指针,并使用之类的移动函数将其传递给lambda

int id = std::stoi(idToken->second);
std::unique_ptr<int> idPtr;
*idPtr = id;
auto newNode = std::find_if(_nodes.begin(), _nodes.end(), [idPtr = std::move(idPtr)](GraphNodeUniquePtr node){ return node.get()->GetID() == *idPtr.get(); });

现在编译器又给了我一个错误:

error: use of deleted function ‘ChatLogic::LoadAnswerGraphFromFile(std::string)::<lambda(ChatLogic::GraphNodeUniquePtr)>::<lambda>(const ChatLogic::LoadAnswerGraphFromFile(std::string)::<lambda(ChatLogic::GraphNodeUniquePtr)>&)’

所以我尝试了其他方法,我明白为什么它不起作用,而这两种方法我都不明白为什么它没有起作用。我想在GraphNode上创建一个共享指针,但这样我就失去了的独家所有权

如何将此原始指针实现调整为唯一指针?

感谢

不能通过复制传递std::unique_ptr。您可以使用参考:

[&id](const GraphNodeUniquePtr& node){ return node->GetID() == id; });

或者,与适用于两个版本的const auto&

[&id](const auto& node){ return node->GetID() == id; });

最新更新