选自modernescpp
作者:JP Tech等
机器之心编译
参与:Panda、杜伟
C++20(C++ 编程语言标准 2020 版)将是 C++ 语言一次非常重大的更新,将为这门语言引入大量新特性。近日,C++ 开发者 Rainer Grimm 正通过一系列博客文章介绍 C++20 的新特性。目前这个系列文章已经更新了两篇,本篇是第一篇,主要介绍了 C++20 的 Big Four(四大新特性:概念、范围、协程和模块)以及核心语言(包括一些新的运算符和指示符)。
概念:
GCC 支持概念的前一个版本;
std::jthread:
GitHub 上有一个实现草案,来自 Nicolai Josuttis:
https://github.com/josuttis/jthread
模板的要求是接口的一部分;
类模板中的函数重载或特殊化可以基于概念进行;
因为编译器能够比较模板参数的要求与实际的模板参数,所以能得到更好的报错信息。
你可以使用预定义的概念,也可以定义你自己的概念;
auto 和概念的用法统一到了一起。你可以不使用 auto,而是使用概念;
如果一个函数声明使用了一个概念,那么它会自动变成一个函数模板。由此,编写函数模板就变得与编写函数一样简单。
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);
}
template<typename T>
requires Integral<T>()
T gcd(T a, T b){
if( b == 0 ) return a;
else return gcd(b, a % b);
}
可以直接在容器上操作;无需迭代器指定一个范围;
可以宽松地评估;
可以组合。
#include <vector>
#include <ranges>
#include <iostream>
int main(){
std::vector<int> ints{0, 1, 2, 3, 4, 5};
auto even = [](int i){ return 0 == i % 2; };
auto square = [](int i) { return i * i; };
for (int i : ints | std::view::filter(even) |
std::view::transform(square)) {
std::cout << i << ' '; // 0 4 16
}
}
Generator<int> getNext(int start = 0, int step = 1){
auto value = start;
for (int i = 0;; ++i){
co_yield value; // 1
value += step;
}
}
int main() {
std::cout << std::endl;
std::cout << "getNext():";
auto gen = getNext();
for (int i = 0; i <= 10; ++i) {
gen.next(); // 2
std::cout << " " << gen.getValue();
}
std::cout << "\n\n";
std::cout << "getNext(100, -10):";
auto gen2 = getNext(100, -10);
for (int i = 0; i <= 20; ++i) {
gen2.next(); // 3
std::cout << " " << gen2.getValue();
}
std::cout << std::endl;
}
更快的编译时间;
宏的隔离;
表达代码的逻辑结构;
不必再使用头文件(header file);
摆脱丑陋的宏方法。