现在的代码(错误版)
std::unique_ptr
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
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
// 正确写法:不用 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
浙公网安备 33010602011771号