现在的代码(错误版)
std::unique_ptr k = std::make_unique(11);
std::function<std::unique_ptr<int>()> lambda_ = [ w= std::move(k) ]()->std::unique_ptr<int>
{
return std::move(w);
};

编译失败的根本原因:
✖ std::function 存储的 lambda 必须是可拷贝的
但你这个 lambda 内部持有 std::unique_ptr →
unique_ptr 不可拷贝 → lambda 不可拷贝 → 不能放进 std::function
这是 C++ 非常经典的坑!

解决方案
正确解决方案(2 种任选)
方案 1:改用 std::shared_ptr(最简单、最稳)

#include
#include

int main() {
std::unique_ptr k = std::make_unique(11);
std::function<std::shared_ptr<int>()> lambda_ =
[p = std::make_shared<int>(std::move(*k))]() -> std::shared_ptr<int> {
return p;
};
}

方案 2:不使用 std::function,直接用 auto(推荐!)
这是你这段代码唯一能完美运行的写法

std::unique_ptr<int> k = std::make_unique<int>(11);

// 不用 std::function,直接 auto
auto lambda_ = [w = std::move(k)]() -> std::unique_ptr<int> {
return std::move(w);
};

✅ 这个 100% 编译通过、运行正常

为什么你的代码不能用 std::function?
规则铁律:
std::function 要求包装的对象必须能拷贝
持有 unique_ptr 的 lambda 不能拷贝
→ 冲突 → 编译失败

这不是你写错语法,而是C++ 设计如此。

最终你能直接用的【完美版代码】
cpp
运行

include

include

int main() {
std::unique_ptr k = std::make_unique(11);

// 正确写法:不用 function,直接 auto
auto lambda_ = [w = std::move(k)]() -> std::unique_ptr<int> { return std::move(w); };

// 调用测试
auto ptr = lambda_();
std::cout << *ptr << std::endl; // 输出 11
}

总结(一句话记住)
持有 std::unique_ptr 的 lambda → 不能放进 std::function
要存只能用:

auto 直接接收
或改用 shared_ptr

posted on 2026-05-20 15:55  keleman  阅读(9)  评论(0)    收藏  举报