C++26 std::function_ref 与 copyable_function 详解:callable 的 string_view

📅 发布时间:2026/7/6 3:05:58 👁️ 浏览次数:
C++26 std::function_ref 与 copyable_function 详解:callable 的 string_view
C26 std::function_ref 与 copyable_function 详解callable 的 string_view本文是「C26 新特性单篇精讲」系列第 11 篇。阅读约需 7 分钟文末可跳转完整合订本。一、是什么C26 新增两个函数包装器std::function_ref非拥有、类型擦除的可调用对象引用std::copyable_function可拷贝的类型擦除可调用对象类似std::function但语义更清晰。二、为什么需要它std::function会堆分配且拥有目标对象函数指针不能接受 lambda模板会膨胀二进制并必须放在头文件。function_ref零分配、可 trivially copyable、支持 lambdacopyable_function填补了function与move_only_function之间的空白。三、完整代码示例3.1 function_ref 作为回调参数#includefunctional#includeiostreamvoidprocess(std::function_refvoid(int)cb){cb(42);}intmain(){intcount0;process([count](intx){std::coutcount: x\n;});}3.2 copyable_function#includefunctional#includeiostreamstd::copyable_functionint(int)make_multiplier(intfactor){return[factor](intx){returnx*factor;};}intmain(){autofmake_multiplier(3);autogf;// 可拷贝std::coutg(7);// 21}3.3 三种 callable 包装对比包装器拥有目标可拷贝可接受 lambda堆分配函数指针否是否否std::function_ref否是是否std::copyable_function是是是可能std::move_only_function是否是可能std::function是是是可能四、编译器支持与特性测试宏特性GCCClangMSVCstd::function_ref16——std::copyable_function16——#if__cpp_lib_function_ref202306L#includefunctional#endif五、常见陷阱function_ref不拥有目标目标必须在调用期间存活不要返回局部 lambda 的function_ref会造成悬空引用copyable_function要求目标可拷贝若 lambda 捕获了仅移动类型应使用move_only_function。六、小结function_ref是日常回调参数的最佳选择copyable_function是std::function的现代替代品。两者配合可大幅减少模板膨胀和堆分配。返回 C26 新特性全景合订本 C26 新特性全景解析C/C 后台架构学习社区欢迎关注https://github.com/0voice本文基于 C26 已批准特性撰写具体实现以编译器文档为准。