当前位置: 首页 > news >正文

c++26新功能—copyable_function

一、std::copyable_function

std::function在被引入C++标准后,大家用起来还是相当方便的,虽然对于函数指针,std::function确实是有点重量。但实际上,对于大多数的开发者,其实对这个重量不重量并不敏感。不过,它确实还是有一些细节上的问题的。这不,C++26就提出了std::copyable_function,不过大家一定要注意,std::copyable_function并不是替代std::function,而是对其的细节的完善和补充。其定义如下:

copyable_function() noexcept;
copyable_function( std::nullptr_t ) noexcept;
copyable_function( const copyable_function& other );
copyable_function( copyable_function&& other ) noexcept;
template< class F >
copyable_function( F&& f );
template< class T, class... CArgs >
explicit copyable_function( std::in_place_type_t<T>, CArgs&&... args );
template< class T, class U, class... CArgs >
explicit copyable_function( std::in_place_type_t<T>,std::initializer_list<U> il, CArgs&&... args );

二、与std::function区别及应用

那么std::copyable_function和std::function到底有什么不同呢?
1、std::copyable_function支持显示的指定cv限定符、引用限定符以及noexcept规范。
这是什么意思呢,其实就是让函数的匹配更精确,更容易达到设计者的目的,从而避免一些因某些细小的问题导致的函数的调用错误。std::function并未提供异常处理并且存在常量处理的缺陷。
2、std::copyable_function引入了严格的非空处理
如果确实出现了空值的情况,会出现UB行为(这个不好啊),而std::function在类似的情况下会抛出一个异常。
3、不支持RTTI的依赖
std::copyable_function移除了类似 function::target_type() 或 target() 的接口。从而降低了大多数场景中内存和运行的开销

既然这二者有这些细节的不同,又提到前者并不是后者的替代者,那么如何应用到具体的开发场景中呢?
1、在大多数场景下,可以考虑使用std::copyable_function来替代std::function,特别是在新的项目中
2、不必强制必须使用std::copyable_function,当然如果遇到必须对限定符显示处理时,一定要使用它。毕竟其能提供更好的类型安全控制。
3、在新旧工程混用时,如无明确需求,优先使用std::copyable_function,如与std::function有冲突,再使用后者

三、例程

看一下相关的例程:

//  std::function
std::function<int(int)> func11 = [](int x) { return x+x; };//  std::copyable_function :必须使用常量调用且不抛异常
std::copyable_function<int(int) const> func26 = [](int x) noexcept { return x +x; };

再看一个草案中对比的例程:

//1
//c++11
auto lambda{[&]() /*const*/ {}};
function<void(void)> func{lambda};
const auto & ref{func};
func();
ref();//C++26
auto lambda{[&]() /*const*/ {}};
copyable_function<void(void)> func0{lambda};
const auto & ref0{func0};
func0();
ref0(); //err:operator() is NOT const!
copyable_function<void(void) const> func1{lambda};
const auto & ref1{func1};
func1();
ref1(); //operator() is const!

大家想了解更多可参看P2548R6提案文档。

四、总结

C++标准的发展,其实和大家朴素的想法是一致的。整体的方向是朝着强大易用不断前进,细节上不断的完善早期标准的一些问题,以期查漏补缺。一个技术点的形成不可能是一蹴而就的,尤其是在实际的场景应用中,会不断的暴露出其一些受限的短板或者没有考虑的地方,这样就会在后续的标准中有的放矢的进行完善。
回头再想想大家自己的实际开发,是不是也是这么一个过程呢?

http://www.xdnf.cn/news/1105255.html

相关文章:

  • 慕尚花坊项目笔记
  • MoE混合专家模型:千亿参数的高效推理引擎与架构革命
  • 论容器化 | 分析Go和Rust做医疗的后端服务
  • Linux711 Mysql
  • 2025十大免费销售管理软件推荐
  • 《每日AI-人工智能-编程日报》--7月11日
  • Kafka-日常运维命令
  • 一个中层管理者应该看什么书籍?
  • TCP协议详解——初识
  • SQL开窗函数
  • Guava LoadingCache
  • LLM场景下的强化学习【GRPO】
  • 在线重装 Proxmox VE
  • DeepSeek模型分析及其在AI辅助蛋白质工程中的应用-文献精读148
  • C语言文件读写操作详解:fgetc与feof函数的应用
  • RestTemplate动态修改请求的url
  • C++前缀和与差分的深度探索
  • 信号量机制
  • Python-正则表达式-信息提取-滑动窗口-数据分发-文件加载及分析器-浏览器分析-学习笔记
  • Windows GNU Radio避坑
  • 【牛客刷题】dd爱科学1.0
  • 计算机网络第三章(6)——数据链路层《网桥交换机》
  • PHT-CAD 笔记
  • 深入MyBatis:CRUD操作与高级查询实战
  • Visual Studio Code 的 settings.json 配置指南
  • K8s Service 终极解析:源码、性能、故障排查全攻略
  • 深入解析 TCP 连接状态与进程挂起、恢复与关闭
  • ROS1学习第三弹
  • Web安全 - 基于 SM2/SM4 的前后端国产加解密方案详解
  • Web安全-Linux基础-01-初识Linux