C++17和C++20引入的新特性

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更为革命性的特征是协程、概念、模块等,出于性能和安全做了优化。

相关推荐
今儿敲了吗6 小时前
01|多项式输出
c++·笔记·算法
程序员Jared6 小时前
C++11—mutex
c++
朔北之忘 Clancy7 小时前
2025 年 9 月青少年软编等考 C 语言一级真题解析
c语言·开发语言·c++·学习·数学·青少年编程·题解
Xの哲學7 小时前
深入剖析Linux文件系统数据结构实现机制
linux·运维·网络·数据结构·算法
量子炒饭大师7 小时前
【C++入门】Cyber底码作用域的隔离协议——【C++命名空间】(using namespace std的原理)
开发语言·c++·dubbo
AlenTech7 小时前
200. 岛屿数量 - 力扣(LeetCode)
算法·leetcode·职场和发展
C雨后彩虹7 小时前
竖直四子棋
java·数据结构·算法·华为·面试
REDcker7 小时前
RTCP 刀尖点跟随技术详解
c++·机器人·操作系统·嵌入式·c·数控·机床
楚Y6同学7 小时前
基于 Haversine 公式实现【经纬度坐标点】球面距离计算(C++/Qt 实现)
开发语言·c++·qt·经纬度距离计算
不如自挂东南吱8 小时前
空间相关性 和 怎么捕捉空间相关性
人工智能·深度学习·算法·机器学习·时序数据库