C++17
if constexpr
在编译的时候可以来决定是否编译某段代码,从而避免在运行的时候引入不必要的计算
cpp
template<typename T>
void print_type() {
if constexpr (std::is_integral<T>::value) {
std::cout << "Integral type\n";
} else {
std::cout << "Non-integral type\n";
}
}
结构化绑定声明
指的是允许将元组或者多个返回值直接解构,越来越像python了
cpp
std::tuple<int, double, std::string> get_values() {
return {42, 3.14, "Hello"};
}
auto [x, y, z] = get_values(); // 直接解构
std::variant
允许变量持有多种不同类型,但只持有一个类型的值
cpp
std::variant<int, float> v = 10;
if (std::holds_alternative<int>(v)) {
std::cout << "It's an int: " << std::get<int>(v) << "\n";
}
对STL提供并行策略
cpp
#include <algorithm>
#include <vector>
#include <execution>
std::vector<int> v = {1, 2, 3, 4, 5};
std::for_each(std::execution::par, v.begin(), v.end(), [](int& n) { n *= 2; });
增强模板推导能力
C++20新特性
支持协程
引入likely/ unlikely
用于向编译器提示某个分支可能是常见或者不常见的,从而帮助优化分支预测
cpp
if (condition) [[likely]] {
// 可能是常见的分支
} else [[unlikely]] {
// 可能是少见的分支
}
concept
用于约束模板类型,只接受模板参数类型为限定范围,从而增强安全性。
cpp
template<typename T>
concept Integral = std::is_integral<T>::value;
在这里Integral即代表long、short、int等等,在使用的时候为
cpp
template<Integral T>
T add(T a, T b) {
return a + b;
}
接受参数是整数类型,如果传入的不满足这个类型,则编译器会报错。
总结
总的来说,C++17是扩充了语言的灵活度,长得越来越像python了。C++20更为革命性的特征是协程、概念、模块等,出于性能和安全做了优化。