c++ - 将 unique_ptr 的所有权传递给嵌套在 lambda 中的函数
问题描述
我是现代 C++ 的新手,我认为我遗漏了一些关于 lambda 函数和智能指针的关键点,这在尝试在 boost 库中进行沙箱处理时给我带来了一些麻烦。
平台:RHEL7,c++17
我想首先将所有权传递unique_ptr
给 lambda 函数,然后传递给嵌套在 lambda 内部的函数。以下是一些我需要帮助的测试用例。
class TestClass{
private:
std::string message;
public:
TestClass(std::string message): message(message){}
void printMessage(){std::cout << message << std::endl;}
};
void functionNestedInLambda(std::unique_ptr<TestClass> testClass){
testClass->printMessage();
return;
}
int main(){
auto testClass = std::make_unique<TestClass>("Hello Stack Overflow");
auto lFunction = [&](){functionNestedInLambda(std::move(testClass));};
lFunction();
return 0;
}
这编译得很好,并且似乎传递了testClass
to的所有权functionNestedInLambda()
。lambda 的捕获子句中的“按引用传递”让我暂停,因为我不确定所有权testClass
是如何传递给 lambda 函数的。我当时的想法是尝试以与此堆栈溢出帖子中所见相同的方式将所有权显式转移给 lambda:
如何将 unique_ptr 捕获到 lambda 表达式中?.
我变了
auto lFunction = [&](){functionNestedInLambda(std::move(testClass));};
至
auto lFunction = [testClass = std::move(testClass)](){functionNestedInLambda(std::move(testClass));};
这会产生以下编译器错误
error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = TestClass; _Dp = std::default_delete<TestClass>]’
139 | auto lFunction = [testClass = std::move(testClass)](){functionNestedInLambda(std::move(testClass));};
在我看来,这应该首先将所有权传递给 lambda,然后再传递给嵌套函数,但我显然遗漏了一些东西。
实现这一目标的最佳方法是什么?我想尽可能严格地控制对象所有权。
另外,第一个示例究竟是如何编译的?将唯一指针作为对 lambda 的引用传递时如何处理所有权?
解决方案
推荐阅读
- opencv - Openpose 演示在 Ubuntu20.04 中使用 coredump 完成
- websocket - LetsEncrypt Sep 30 到期后,Goaccess Web 套接字在 Safari 上失败
- html - 如何对齐列中的图标、数字和文本?
- python - 是否可以将 SHA1 哈希反转为二进制?
- javascript - 如何在反应js中将数据从一个组件传递到另一个组件
- javascript - document.execCommand('SaveAs', null, 'myFile.html'); 是否有替代方案?在铬浏览器中(Microsoft-Edge)
- selenium - 如何使用 Selenium 执行 google 身份验证?
- node.js - 将请求发布到另一条路线,同时将客户端重定向到那里。表示
- mongodb - 使用限定符查询 mongo 中的嵌套数组
- python - 基于另一个数据帧过滤数据帧