首页 > 解决方案 > 将 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;
}

这编译得很好,并且似乎传递了testClassto的所有权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 的引用传递时如何处理所有权?

标签: c++lambdasmart-pointersunique-ptr

解决方案


推荐阅读