C++20 标准已批准

ISO C++ 语言标准化委员会 批准 国际标准 ”C ++ 20”。 规范中提供的功能(个别情况除外) 被支持 在编译器中 GCC, и Microsoft Visual C ++。 支持C++20的标准库在项目内实现 提升.

在接下来的两个月内,批准的规范将进入准备发布文件的阶段,届时将进行拼写错误和拼写错误的编辑纠正工作。 14882 月初,最终文件将发送给 ISO,以正式名称 ISO/IEC 2020:23 进行发布。 与此同时,委员会已经开始制定下一个 C++2 标准 (C++XNUMXb),并将在下一次虚拟会议上考虑可能的选择。 创新.

产品特点 C ++ 20 (代码示例):

  • 添加了“概念”(模板扩展),允许您定义一组模板参数要求,这些要求在编译时限制可以接受为模板参数的参数集。 这些概念可用于避免模板内使用的数据类型的属性与输入参数的数据类型属性之间的逻辑不一致。

    模板
    概念 EqualityComparable = 需要(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • 公认 扩张 用于使用可以代替头文件使用的模块。 模块提供了一种基于定义组件边界来组织源代码的新方法,而无需通过“#include”包含头文件。
  • 宏 __VA_OPT__ 用于根据变量参数中标记的存在来自适应扩展变量宏。
  • 支持“”运算符进行三向比较。
  • 支持位域的默认元素初始值设定项。
  • 能够 lambda 捕获“*this”表达式。

    结构 int_value {
    整数n = 0;
    自动 getter_fn() {
    //坏的:
    // 返回 [=]() { 返回 n; };

    // 好的:
    返回 [=, *this]() { 返回 n; };
    }
    };

  • 通过指针(指向成员的指针)调用元素,使用指向通过“const &”表达式定义的临时对象的指针。
  • 文档中描述的带有析构函数的删除操作符 P0722R1.
  • 类可以使用没有类型的模板参数。

    结构 foo {
    foo() = 默认值;
    constexpr foo(int) {}
    };

    模板
    自动 get_foo() {
    返回 f;
    }

    get_foo(); // 使用隐式构造函数
    获取富();

  • 带有构造函数的非持久 lambda 表达式。
  • 允许 lambda 表达式的模板语法(“auto f = [] (标准::向量v)”)。
  • 能够在模板参数中使用字符串文字。
  • 支持 C 风格初始化语法 - 默认情况下初始化初始化列表中未明确列出的字段。

    结构体{
    int x;
    输入 y;
    整数 z = 123;
    };

    A a {.x = 1, .z = 2}; // ax == 1, ay == 0, az == 2

  • 支持空数据结构成员。
  • 支持可能和不可能的属性,以告知优化器触发条件构造的概率(“[[可能]] if (random > 0) {“)。
  • 能够在“for”循环中使用范围来初始化变量值

    for (auto v = std::vector{1, 2, 3}; auto& e : v) {

  • new(“new double[]{1,2,3}”)中自动计算数组大小;
  • “[[no_unique_address]]”属性,其中没有数据的变量不占用空间。
  • 原子指针(std::atomic > 和 std::atomic >)。
  • 能够在条件表达式中调用虚函数。
  • 支持只能使用常量的立即函数。

    consteval int sqr(int n) {
    返回 n * n;
    }

    constexpr int r = sqr(100); // 好的
    整数 x = 100;
    int r2 = sqr(x); // 错误:'x' 不能用作常量

  • 可以将 constexpr 与虚函数一起使用(“constexpr virtual int f() const { return 2; }”)。
  • 在标准库中:
    • 添加了对 UTF-8 字符串的 char8_t 类型的支持。
    • 添加了头文件位(位操作)和版本。
    • 现在可以检查字符串的前缀和后缀(starts_with、ends_with)。
    • 添加了 std::remove_cvref、std::unwrap_reference、std::unwrap_decay_ref、std::is_nothrot_convertible 和 std::type_identity 特征。
    • 添加了函数 std::midpoint、std::lerp、std::bind_front、std::source_location、std::visit、std::is_constant_evaluated 和 std::assume_aligned。
    • 向 std::make_shared 添加了对数组的支持。
    • 添加了 std::to_array 函数以将类似数组的对象转换为 std::array。
  • 更方便的枚举语法:

    枚举类 rgba_color_channel { 红、绿、蓝、alpha };

    std::string_view to_string(rgba_color_channel my_channel) {
    切换(我的频道){
    使用枚举 rgba_color_channel;
    案例红色:返回“红色”;
    案例绿色:返回“绿色”;
    案例蓝色:返回“蓝色”;
    案例阿尔法:返回“阿尔法”;
    }
    }

  • 在索引中,由于未定义的行为,禁止使用操作“,”(“a[b,c]”)。 已不再支持大多数使用 volatile 关键字声明的变量的操作,包括标准类型的“++”和“—”操作。
  • 减少了需要“typename”来指示类型存在的情况的数量。

来源: opennet.ru

添加评论