C++20(C++ 编程言语标准 2020 版)将是 C++ 言语一次十分严重的更新,将为这门言语引入少量新特性。近日,C++ 开发者 Rainer Grimm 正经过一系列博客文章引见 C++20 的新特性。目前这个系列文章曾经更新了两篇,本篇是第一篇,主要引见了 C++20 的 Big Four(四大新特性:概念、范围、协程和模块)以及中心言语(包括一些新的运算符和指示符)。
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++20 中心言语特征。
库方面的状况相似。GCC 在库方面的支持最好,接上去是 Clang 和 MSVC 编译器。
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)