如果一个唯一的指针是一个捕获的值,为什么它不能在lambda内移动?

时间:2019-08-18 17:07:36

标签: c++ c++17

以下代码无法编译:

struct S{};

void foo(std::unique_ptr<S> ptr)
{
    auto l = [p = std::move(ptr)]()
    {
        auto p2 = std::move(p);
    };
    l();
}

原因是std::move(p)返回一个左值引用,因此编译器尝试调用被删除的复制构造函数。为什么move在这里返回左值引用?

Here是完整样本。

1 个答案:

答案 0 :(得分:8)

标记lambda mutable,否则捕获const。如

auto l = [p = std::move(ptr)]() mutable { ... };