• 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"; };
    
    • 1

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

    // 不可以
    [[nodiscard, nodiscard]] int get()
    {
        return 0;
    }
    
    // 可以
    [[nodiscard]][[nodiscard]] int get()
    {
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

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

    三、总结

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

  • 相关阅读:
    如何把“中式发音”调整到机器偏爱的口音?Elena老师带你详解突破点!
    【SA8295P 源码分析】125 - MAX96712 解串器 start_stream、stop_stream 寄存器配置 过程详细解析
    Spring面试攻略:如何展现你对Spring的深入理解
    大黑书《离散数学及其应用》之Dijkstra算法
    【C++】面向对象编程(二)面向对象的编程思维:virtual虚拟调用、继承、protected成员、派生类与基类
    Spring boot 实战指南(一):入门、配置、Web、文件上传、异常页面
    Leetcode1071. 字符串的最大公因子(三种方法,带详细解析)
    2023-10-28 思考-精力管理-分析
    useReducer+createContext真的可以代替Redux吗?
    代码随想录-45-102. 二叉树的层序遍历
  • 原文地址:https://blog.csdn.net/fpcc/article/details/134217431