惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
D
DataBreaches.Net
博客园 - 三生石上(FineUI控件)
博客园_首页
T
Tailwind CSS Blog
美团技术团队
Hugging Face - Blog
Hugging Face - Blog
博客园 - 叶小钗
大猫的无限游戏
大猫的无限游戏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
云风的 BLOG
云风的 BLOG
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 聂微东
S
SegmentFault 最新的问题
小众软件
小众软件
酷 壳 – CoolShell
酷 壳 – CoolShell
N
Netflix TechBlog - Medium
Jina AI
Jina AI
WordPress大学
WordPress大学
U
Unit 42
J
Java Code Geeks
Blog — PlanetScale
Blog — PlanetScale
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The Cloudflare Blog

博客园 - keleman

lambda 如何捕获 所在子线程ID 配置 git 到达 通过 git &&ssh 登录 gitee.com 和 github.com 整理于豆包问答,测试可以实现 由QThread::currentThread()引出的 如何在线程中安全运行任务 由豆包整理的 C++ Lambda 捕获方式・安全写法速查表 整理自豆包 C++14 Lambda 相比 C++11 的核心改进 firefox 149 在 linux mint 21 上的 mozillia 源安装 qt GUI 如何利用q thread 和qfuturwatcher 实现 不阻塞主线程? xargs 和管道 |的区别 一加5t的volte怎么设置 做上位机软件设计 下位机软件设计 qt 将槽函数在子线程中执行的方法 以二级指针作为函数参数,并从函数中分配空间的原理 std::forward<T> ,std::move 使用场景的区别 VS2017 设置 类模板参数推导(CTAD, Class Template Argument Deduction) postEvent 和 sendEvent的区别 QObject Event( )customEvent( ) 函数区别 关于实际项目中必要的几个文件操作接口 QwaitCondition.的工作原理 【Debian】更换软件 源出现的Certificate问题解决方法 linux PS1 提示符的颜色设置 python 的几个常用的函数 知识点 设置 docker 国内的 映像加速器 docker 容器安装软件 docke 容器设置代理 docker 安装问题
持有 std::unique_ptr 的 lambda → 不能放进 std::function ...
keleman · 2026-05-20 · via 博客园 - keleman

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

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

#include
#include

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

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 {
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 {
return std::move(w);
};

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

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

auto 直接接收
或改用 shared_ptr