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

c++26新功能—带原因说明的删除函数

一、C++对函数的隐藏/删除处理

在早期的C++开发中,为了一些实际的需要,可能会对一些函数隐藏,比如在某些情况下需要禁止构造函数或拷贝构造函数等,那么就将其移动到私有函数中处理即可。这样对外的接口便被禁止了。而到了C++11标准后,标准库提供了=delete的形式,来显式的阻止编译器生成此函数。这样做的好处不言而喻,但这样做也会有一些副作用,比如大量的引入=delete,设计者可能就会忘记最初的目的是为什么要删除这个函数。而后面代码的应用者和维护者也会产生相同的问题。所以在C++26中提供了一个带删除说明的=delete。

二、C++26中的删除函数

在最新的提案中,删除函数的基本的形式如下:

= delete("reason");

大家都知道,在C++26标准前,要想实现一种带有说明内容的控制代码,常见的有以下几种情况:
1、使用类似断言static_assert(expr, “reason”)等来处理(C++11)
2、使用属性[[deprecated(“with reason”)]],但它不会阻止编译(C++14)
3、使用属性[[nodiscard(“with reason”)]],同样也会阻止编译(C++17)
怎么说呢?它们都比较好用,但终究在应用到=delete时感到有些不爽。

三、应用例程

看一下不同标准下相关的例程比较:

//C++98
class NonCopyable
{
public:// ...NonCopyable() {}
private:// copy members; no definitionNonCopyable(const NonCopyable&);NonCopyable& operator=(const NonCopyable&);
};
//C++11
class NonCopyable
{
public:// ...NonCopyable() = default;// copy membersNonCopyable(const NonCopyable&) = delete;NonCopyable& operator=(const NonCopyable&) = delete;// maybe provide move members instead
};
//C++26
class NonCopyable
{
public:// ...NonCopyable() = default;// copy membersNonCopyable(const NonCopyable&)= delete("Since this class manages unique resources, \
copy is not supported; use move instead.");NonCopyable& operator=(const NonCopyable&)= delete("Since this class manages unique resources, \
copy is not supported; use move instead.");// provide move members instead
};

代码一对比非常清晰,怎么着更容易为开发者所接受是非常容易理解的。

四、=delete限制的场景

虽然说这个删除形式非常好用,但在实际应用时也有场景限制的,如下:
1、纯虚拟函数不允许使用,虚函数的删除要严格处理
2、不能删除override标记的函数(类似于1)
3、对某些函数不建议或者严格限制使用,比如删除析构函数、构造函数等
4、不能删除某些模板中的实例化函数
5、注意不能应用到非函数的场景,比如变量就不可以应用

##五、总结
本文介绍的其实是一个把边边沿沿的小功能组合一下,让其更加容易使用并达到相关的应用目的的库的完善。没有什么高大上的功能,但就如好车上一些小细节的处理,让开发者感到舒适和方便,这其实也体现了标准的强大之处。

http://www.dtcms.com/a/350431.html

相关文章:

  • 用 PyTorch 从零实现 MNIST 手写数字识别
  • 微论-神经网络中记忆的演变
  • volatile关键字:防止寄存器操作被优化
  • Java设计模式-装饰器模式:从“咖啡加料”到Java架构
  • 动态线程池核心解密:从 Nacos 到 Pub/Sub 架构的实现与对比
  • 使用百度统计来统计浏览量
  • 网易算法岗位--面试真题分析
  • 江苏安全员 A 证 “安全生产管理” 核心考点
  • 【笔记】Roop 之 NSFW 检测屏蔽测试
  • 电池分选机:破解电池性能一致性难题的自动化方案|深圳比斯特
  • 【车载开发系列】ParaSoft集成测试环境配置(五)
  • Seaborn数据可视化实战:Seaborn数据可视化实战入门
  • 我的小灶坑
  • 使用 gemini 来分析 github 项目
  • 【Day 33】Linux-Mysql日志
  • Linux 系统内存不足导致服务崩溃的排查方法
  • 跨站脚本攻击(XSS)分类介绍及解决办法
  • 单北斗变形监测系统应用维护指南
  • 59 C++ 现代C++编程艺术8-智能指针
  • 探索量子计算的新前沿
  • 深度学习之第三课PyTorch( MNIST 手写数字识别神经网络模型)
  • Telematics Control Unit(TCU)的系统化梳理
  • 从零开始学习单片机14
  • Fory序列化与反序列化
  • 以正确方式构建AI Agents:Agentic AI的设计原则
  • 技术速递|使用 AI 应用模板扩展创建一个 .NET AI 应用与自定义数据进行对话
  • 【Hadoop】HDFS 分布式存储系统
  • Nuxt.js@4 中管理 HTML <head> 标签
  • 【二叉树 - LeetCode】236. 二叉树的最近公共祖先
  • TAISAW钛硕|TST嘉硕Differential output Crystal Oscillator - TW0692AAAE40