讲师中心 微信公众号
AI工具推荐 视频效率加速

C++中std::move_only_function怎么用_C++23只移函数封装器介绍【核心】

秋雪大大_8538

秋雪大大_8538

发布时间:2026-02-08 13:56:02

|

203人浏览过

|

来源于php中文网

原创

std::move_only_function是C++23引入的仅移动函数封装器,专用于不可拷贝的可调用对象,如捕获unique_ptr或mutex的lambda、禁用拷贝的functor及返回move-only类型的回调。

c++中std::move_only_function怎么用_c++23只移函数封装器介绍【核心】

std::move_only_function 是 C++23 引入的轻量级、仅移动(move-only)函数封装器,专为不能拷贝的可调用对象设计。它不依赖 std::function 的拷贝语义和类型擦除开销,底层不强制要求目标可调用对象支持拷贝——只要能移动即可。

什么时候必须用 std::move_only_function 而不是 std::function

当你需要存储或传递以下类型的可调用对象时,std::function 会编译失败,而 std::move_only_function 是唯一可行选择:

  • 捕获了 std::unique_ptr、std::mutex 或其他不可拷贝资源的 lambda
  • 移动语义明确禁用拷贝的自定义 functor(例如声明了 deleted 拷贝构造/赋值)
  • 返回 std::unique_ptr 或其他 move-only 类型的异步回调(如某些协程 awaiter 回调)

典型错误现象:error: use of deleted function 'X::X(const X&)' —— 这说明你试图把 move-only 可调用对象塞进 std::function。

std::move_only_function 的声明与基本用法

头文件是 <functional></functional>,模板参数语法与 std::function 一致,但内部不提供拷贝构造/赋值操作符:

立即学习“C++免费学习笔记(深入)”;

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
std::move_only_function<int(int, const std::string&)> f1;
f1 = [ptr = std::make_unique<int>(42)](int x, const std::string& s) mutable {
    return x + *ptr + s.size();
}; // OK:lambda 含 unique_ptr,仅可移动
// f1 = f1; // 编译错误:no matching constructor for initialization

注意点:

  • 不能隐式转换为 std::function,也不能从 std::function 构造
  • 支持 nullptr 初始化,调用前需用 if (f) 检查是否为空
  • 不保证 noexcept,调用 operator() 仍可能抛异常(取决于被封装对象)

性能与内存布局差异:为什么它更轻?

std::move_only_function 不强制要求 small-buffer optimization(SBO),也不预留固定大小的缓冲区来“内联”小可调用对象。它的实现更接近裸指针+虚表或状态机式分发,避免了 std::function 中为兼容拷贝而做的冗余存储和分支判断。

  • 典型大小:在 libstdc++ 和 libc++ 中,空 std::move_only_function 通常为 16 字节(两个指针),而 std::function 常为 32 字节(含 SBO 缓冲)
  • 无拷贝意味着无引用计数、无原子操作、无额外析构守卫逻辑,移动构造/赋值更快
  • 不支持 target 或 target_type() —— 类型信息在移动后即丢失,这是设计取舍

常见陷阱与兼容性提醒

目前(GCC 13/Clang 17,MSVC 19.37+)支持尚属早期,容易踩坑:

  • libstdc++ 需要 -std=c++23 -D_GLIBCXX_USE_CXX11_ABI=1,否则可能链接失败或行为异常
  • 不能用于需要拷贝的上下文:例如 std::vector<:move_only_function>></:move_only_function> 的 resize() 或 insert() 会触发拷贝,应改用 emplace_back() 或确保只 move
  • 不能绑定到 std::bind 返回值(因 std::bind 结果默认可拷贝),需改用 lambda 封装
  • 调试时无法像 std::function 那样通过 target_type() 查看类型 —— 这是 move-only 设计的必然代价

真正关键的限制在于:它只解决「移动」问题,不解决「类型反射」或「运行时检查」需求。一旦你需要知道封装的是什么,就得在封装前自己记下来。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

相关专题

更多
scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1009

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3160

2023.10.25

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2298

2023.09.20

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

636

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

371

2025.11.27

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

1071

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

345

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

594

2026.01.05

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn