您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    解读C++行将迎来的严重更新:C++20的四大新特性
    时间:2020-03-06 21:22 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    C++20(C++ 编程言语标准 2020 版)将是 C++ 言语一次十分严重的更新,将为这门言语引入少量新特性。近日,C++ 开发者 Rainer Grimm 正经过一系列博客文章引见 C++20 的新特性。目前这个系列文章曾经更新了两篇,本篇是第一篇,主要引见了 C++20 的 Big Four(四大新特性:概念、范围、协程和模块)以及中心言语(包括一些新的运算符和指示符)。

    解读C++行将迎来的严重更新:C++20的四大新特性

    C++20 有很多更新,上图展现了 C++20 更新的概略。下面作者首先引见 了 C++20 的编译器支持状况,然后引见 The Big Four(四大新特性)以及中心言语方面的新特性。

    C++20 的编译器支持

    顺应新特性的最复杂办法是试用它们。那么接上去我们就面临着这个成绩:哪些编译器支持 C++20 的哪些特性?普通来说,cppreference.com/compiler_support_能提供在中心言语和库方面的答案。

    复杂来说,全新的 GCC、Clang 和 EDG 编译器能提供对中心言语的最佳支持。此外,MSVC 和 Apple Clang 编译器也支持许多 C++20 特性。

    解读C++行将迎来的严重更新:C++20的四大新特性

    C++20 中心言语特征。

    库方面的状况相似。GCC 在库方面的支持最好,接上去是 Clang 和 MSVC 编译器。

    解读C++行将迎来的严重更新:C++20的四大新特性

    C++20 库特征。

    下面的截图仅展现了对应表格的前面一部分,可以看出这些编译器的表现并不是十分令人称心。即使你运用的是全新的编译器,这些编译器依然不支持很多新特性。

    通常来说,你能找到尝试这些新特性的办法。下面是两个示例:

    概念:

    GCC 支持概念的前一个版本;

    std::jthread:

    GitHub 上有一个完成草案,来自 Nicolai Josuttis:

    https://github.com/josuttis/jthread

    复杂来说,成绩没有那么严重。只需求一些调整修正,很多新特性就能停止尝试。如有必要,我会提到如何停止这样的修正。

    四大新特性

    概念(concept)

    运用模板停止通用编程的关键思想是定义能经过各种类型(type)运用的函数和类。但是,在实例化模板时常常会出现用错类型的成绩,其结果通常是几页难懂的报错信息。

    如今概念来了,这个成绩可以休矣。概念让你能为模板编写要求,而编译器则可以反省这个要求。概念改造了我们思索和编写通用代码的方式。缘由如下:

    模板的要求是接口的一部分;

    类模板中的函数重载或特殊化可以基于概念停止;

    由于编译器可以比较模板参数的要求与实践的模板参数,所以能失掉更好的报错信息。

    但是,这还不是全部。

    你可以运用预定义的概念,也可以定义你本人的概念;

    auto 和概念的用法一致到了一同。你可以不运用 auto,而是运用概念;

    假设一个函数声明运用了一个概念,那么它会自动变成一个函数模板。由此,编写函数模板就变得与编写函数一样复杂。

    下面的代码片段展现了一个复杂概念 Integral 的定义和运用方式:

    template<typename T> 

    concept bool Integral(){ 

        return std::is_integral<T>::value; 

     

    Integral auto gcd(Integral auto a,      

                      Integral auto b){ 

        if( b == 0 ) return a;  

        else return gcd(b, a % b); 

    Integral 这个概念需求 std::is_integral<T>::value 中的类型参数 T。std::is_integral<T>::value 这个函数来自 type-traits 库,它能在 T 为整数反省编译时间。假设 std::is_integral<T>::value 的值为 true,则没有成绩。假设不为 true,则你会收到一个编译时间报错。假设你很猎奇(你也应该猎奇),我的这篇文章引见了 type-traits 库:https://www.modernescpp.com/index.php/tag/type-traits。

    (责任编辑:admin)