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

c++23中的新功能之十八新增的属性

一、c++23新的属性

在前面的分析中说过,各种语言的发展整体思路是一致的,即朝着更加实用、简单和更接近自然语言的方向在前进。c++23中也在不断的完善和增加相关开发的一些属性和预编译处理指令,这样就可以让开发者在开发的过程中对程序进行控制而不必非得等到运行时才能预判到结果。
在c++11后,c++14,c++17,c++20都有新的属性(Java叫注解)的引入,所以c++23也要引入一些,这也算是传统了。
在c++23中,引入了assume属性并且在lambda表达式中也新增了属性的支持。

二、作用和例程

一个生态体系的架构不是一朝一夕完成的。同样,c++标准的完善和迭代也是一个冗长的过程。一个新标准的加入,不管是语言层次还是库层次,一定有一个需求发展的过程。可能在早期这个功能需求并不强烈,而且可能有一些不完善,但随着技术的发展和提出的草案越来越全面,这种功能加入到新标准就会可能性越来越大。这个在c++11到c++23中都有很多例子可以说出来。
今天介绍的这几个新功能就是在这种情况下引入的。
1、lambda表达式新增属性支持
在c++语法中,lambda往往代表着一些普通的语法无法在其中使用,比如早期的模板和auto等。但这些都在后期慢慢补齐了。而属性的出现,同样需要在lambda表达式中有应用的需求:

auto func = [] [[nodiscard]] ()->std::string  { return "123"; };

即使是如此,仍然有一些属性在lambda表达式中的应用还是会受到受制,比如[[noreturn]]。另外,由于宏生成代码的特殊性,新标准对重复属性定义取消了限制的情况:

// 不可以
[[nodiscard, nodiscard]] int get()
{return 0;
}// 可以
[[nodiscard]][[nodiscard]] int get()
{return 0;
}

反正是能支持的尽量支持,有点过分的暂时不支持,以后支持不支持,不好说。

2、assume
这个属性的功能其实在许多平台的编译器的扩展中早就进行了支持,它的意思是如果在编译期某个条件必然成立后就可以停止对整体范围内的错误检查。这句话有点不太顺溜,看下代码就明白了:

double get(double x)
{//必须要做x !=0的判断if (x > 0){return 100.00/x;}
}
double get(double x)
{[[assume(x > 0)]]return 100.00/x;
}

就如上面的代码,一般来说,当进行除法运算时,一定要检查除数是否为0,但是assume确定其大于0后,就不需要再做其进行判断了。这和constexptr if有相似的地方。

三、总结

c++23的新功能基本就要介绍完了,其中一些代码由于无法运行,可能会存在着一些错误。这些大家都可以先明白标准提出的目的。也欢迎大家提出各种批评和意见,大家共同进步。真理越辩越明,技术越讨论就明晰。
等到各大平台的编译器基本支持c++23的主流功能后,这些新功能才有可能应用到实际的工程中去。现在很多公司都在升级c++标准,至少c++17主流的编译器目前都已经进行了支持,所以新的标准不断的在新项目中采用,大家还是有序跟进不要掉队。

http://www.lryc.cn/news/217615.html

相关文章:

  • 动手学深度学习:1.线性回归从0开始实现
  • 【计算机网络】应用层
  • python 深度学习 解决遇到的报错问题9
  • 能源管理系统为什么选择零代码开发平台?
  • 【LeetCode】剑指 Offer Ⅱ 第8章:树(12道题) -- Java Version
  • 利用maven的dependency插件将项目依赖从maven仓库中拷贝到一个指定的位置
  • 在Flask中实现文件上传七牛云中并下载
  • 【Linux】centOS7安装配置及Linux的常用命令---超详细
  • 【ES专题】ElasticSearch搜索进阶
  • 【iOS免越狱】利用IOS自动化WebDriverAgent实现自动直播间自动输入
  • Python基础入门例程28-NP28 密码游戏(列表)
  • 乌班图 Linux 系统 Ubuntu 23.10.1 发布更新镜像
  • Java金字塔、空心金字塔、空心菱形
  • 前端 | (十四)canvas基本用法 | 尚硅谷前端HTML5教程(html5入门经典)
  • 206.反转链表
  • SpringBoot项目从resources目录读取文件
  • SQL实现根据时间戳和增量标记IDU获取最新记录和脱IDU标记
  • 京东数据平台:2023年9月京东智能家居行业数据分析
  • 计算两个时间之间连续的日期(java)
  • Kali Linux:网络与安全专家的终极武器
  • Leetcode—101.对称二叉树【简单】
  • 判断是否工作在docker环境
  • 文件上传学习笔记
  • 【GitLab CI/CD、SpringBoot、Docker】GitLab CI/CD 部署SpringBoot应用,部署方式Docker
  • GitLab(2)——Docker方式安装Gitlab
  • [100天算法】-数组中的第 K 个最大元素(day 54)
  • 每日一题411数组中两个数的最大异或值(哈希表、前缀树:实现前缀树)
  • 机场运行关键指标计算规则
  • 基于元学习神经网络的类人系统泛化
  • 力扣第322题 零钱兑换 c++ java 动态规划