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

Why is a unique pointer not movable inside a lambda if it's a captured value?

本文关键字:不能 lambda 移动 为什么 指针 唯一 如果      更新时间:2023-10-16

以下代码无法编译:

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在这里返回左值引用?

这是一个完整的示例。

将 lambda 标记为mutable,否则其捕获const。如在

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