C++版本更新历史

ops/2024/10/21 3:06:31/

前言

        C++语言发展至今已经迭代了很多版本,而在不同环境中编写代码时经常看到C++标准的设定,比如 Leetcode 中可以看到版本信息:

        这说明Leetcode已经支持最新C++23标准了,但某些环境并不一定支持这些语法,如果不清楚使用的语法属于哪个版本就盲目去写,将无法成功编译。本文整理了C++各个版本的常用特性方便查阅和学习。

起源

        C++ 语言的发展史可以追溯到 1979 年,当时丹麦科学家 Bjarne Stroustrup 在贝尔实验室工作,为了提高软件开发的效率和灵活性,他开始为 C 语言添加类和面向对象编程的特性。这些早期的尝试被称为 "C with Classes"。在 1983 年,Stroustrup 将这个语言重新命名为 C++,这个名字由 Rick Mascitti 提出,意在表达这是 C 语言的一个继承和扩展。

C++98

        C++98为C++语言制定了第一个官方标准,统一了不同编译器和平台之间的差异,提高了代码的可移植性和稳定性 。引入了STL,一套通用的模板库,提供了丰富的数据结构和算法。还引入了异常处理机制和命名空间的概念。

C++11

        非常重要的一次版本更新,平时用的最多的语法和特性(※)基本都是C++11时就有的。

  • 自动类型推导:引入了auto关键字,可以根据初始化表达式自动推导出变量的类型 。

auto x = 5;          // int
auto y = 5.0;        // double
auto z = "Hello";    // const char*vector<int> v = {1, 2, 3, 4, 5};
for (auto it = v.begin(); it != v.end(); ++it) {cout << *it << " ";  // 使用auto推导迭代器类型
}
  • 范围for循环:引入了范围for循环的语法(元素:容器),遍历容器更简洁 。

vector<int> v = {1, 2, 3, 4, 5};
for (auto n : v) {cout << n << " ";  // 直接遍历容器中的元素
}
  • 智能指针:引入了智能指针,可以自动管理内存资源 。

#include <memory>
//std::unique_ptr 的设计初衷是确保资源的唯一所有权,以简化资源管理并避免内存泄漏。
//如果你需要共享资源,应该使用 std::shared_ptr。
//std:weak_ptr 用于解决shared_ptr可能导致的循环引用问题,不拥有资源,不增加引用计数。
unique_ptr<int> up(new int(10));
shared_ptr<int> sp(new int(20));
weak_ptr<int> wp = sp;
  • Lambda表达式:引入了Lambda表达式,可以方便地定义匿名函数对象 。

auto lambda = [](int x, int y) {return x + y;
};cout << "Sum: " << lambda(5, 10) << endl;  // 使用Lambda表达式计算和
  • 可变参数模板:允许模板函数或模板类接受不确定数量的模板参数,但是需要手动解参数包,通常涉及到递归。

template<typename T, typename... Args>
void print(T first, Args... args) {cout << first << ", ";print(args...); // 递归调用
}
  •  并发编程支持:提供了对并发编程的支持,包括线程库、原子操作、互斥量等 。

#include <thread>
thread t([]() {cout << "Hello, world!" << endl;
});t.join();  // 等待线程t完成

C++14

  • 泛型Lambda表达式:在Lambda表达式中使用auto关键字进行类型推导 。

//匿名函数更加灵活
auto add = [](auto a, auto b) { return a + b; };
cout << add(5, 3) << endl;    // 输出 8
cout << add(3.14, 2.56) << endl; // 输出 5.7
  • 变量模板:可以定义模板化的变量,使得代码更加通用和可重用 。

template<typename T>
constexpr T pi = T(3.14159265358979323846);
cout << pi<int> << endl;    // 输出 3
cout << pi<double> << endl;  // 输出 3.14159265358979323846
  • 放松的constexpr限制:允许在constexpr函数中使用更多的语言特性 。

constexpr int factorial(int n) {return (n <= 1) ? 1 : (n * factorial(n - 1));
}
cout << factorial(5) << endl; // 输出 120,编译时计算
  • 二进制字面量:可以方便地表示二进制数值 。

int binaryValue = 0b1101; // 表示二进制值1101,即十进制的13
cout << binaryValue << endl; // 输出 13

C++17

  • ※结构化绑定:可以方便地解构数据结构中的成员变量 。

struct Point {int x, y;
};int main() {Point p{1, 2};auto [x, y] = p; // 结构化绑定,解构Point结构体cout << x << ", " << y << endl; // 输出 1, 2
}
  • if constexpr语句:可以在编译时进行条件判断和优化 。

template <typename T>
void doSomething(T value) {if constexpr (std::is_integral<T>::value) {cout << "T is an integral type" << endl;} else {cout << "T is not an integral type" << endl;}
}int main() {doSomething(5);    // 编译时会选择执行is_integral分支doSomething(3.14); // 编译时会选择执行!is_integral分支
}
  • 折叠表达式:可以方便地对参数包进行展开和操作 。

template <typename... Args>
int sum(Args... args) {return (0 + ... + args); // 折叠表达式,将所有参数相加
}int main() {cout << sum(1, 2, 3, 4) << endl; // 输出 10
}
  • 新增算法和数据结构:如std::variantstd::optional 。

#include <variant>
#include <optional>std::variant<int, double, std::string> v = 42; // variant可以存储多种类型中的一个
std::optional<int> o = std::make_optional(10);  // optional用于表示可能为空的值int main() {if (o) {cout << *o << endl; // 输出 10,如果o有值}std::visit([](auto&& arg) { cout << arg << endl; }, v); // 输出 42,使用std::visit来访问variant的值
}

C++20

  • 概念(Concepts):提供了编译时类型检查的功能 ,允许程序员定义一组约束,只有满足这些约束的类型才能作为模板参数。

template<typename T>
concept Addable = requires(T a, T b) {{ a + b } -> std::same_as<T>;
};template<Addable T>
T add(T a, T b) {return a + b;
}
  • 协程(Coroutines):实现了轻量级的协程,为编写异步代码提供了便利 。

#include <iostream>
#include <coroutine>// 定义协程的返回对象
struct Task {struct promise_type {Task get_return_object() { return {}; }std::suspend_never initial_suspend() { return {}; }std::suspend_never final_suspend() noexcept { return {}; }void return_void() {}void unhandled_exception() {}};
};Task myCoroutine() {// 在这里编写协程的逻辑std::cout << "Hello, ";std::coroutine::suspend_never one;std::coroutine::suspend_never two;std::coroutine::resume(one);std::coroutine::resume(two);std::cout << "World!" << std::endl;
}int main() {myCoroutine();
}
  • 模块(Modules):改进了程序的单元隔离和增量编译 ,允许将代码组织成更小的、可维护的单元。模块可以提高编译速度,因为它们可以被编译器缓存和重用。

// example.cppm
export module example;
export int add(int a, int b) { return a + b; }// main.cpp
import example;int main() {int result = add(3, 5);return result;
}
  • 范围(Ranges):为处理序列数据提供了统一的接口 。

#include <iostream>
#include <ranges>
#include <vector>int main() {std::vector<int> v = {5, 3, 9, 1, 6};// 使用自定义比较函数进行排序std::ranges::sort(v, std::greater<>{});for (int n : v) {std::cout << n << ' ';}std::cout << '\n'; // 输出排序后的向量:9 6 5 3 1
}
  • 标准库增强:添加了一些新的特性,如span ,它提供了一种轻量级的方式来表示连续内存区域的一段区间,本身不拥有它所指向的内存,只是提供了一种访问内存的方式。

C++23

C++前沿开发 - 腾讯云开发者社区


The End

参考资料

cppreference中文

现代 C 与 C++ 开发基础


http://www.ppmy.cn/ops/118381.html

相关文章

Python pyusb 使用指南【windows+linux】

前言&#xff1a;USB(通用串行总线)作为一种高度通用性的硬件接口&#xff0c;在诸多领域均有应用。在C中可以直接使用libusb库即可完成USB设备信息查询、USB设备监听、与USB设备控制端点、数据&#xff08;同步、批量、中断&#xff09;端点进行指令、数据交互等功能。python中…

【智能大数据分析 | 实验二】Spark实验:部署Spark集群

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘&#xff0c;以提取有价值的信息和洞察。它结合了大数据技术、人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&a…

极狐GitLab 17.4 重点功能解读【一】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

自动化运维工具 Ansible

Ansible 基础 Ansible 介绍 Ansible 是一个自动化运维工具&#xff0c;基于Python开发&#xff0c;集合了众多运维工具&#xff08;puppet、cfengine、chef、 func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置、批量程序部署、批量运行命令等功能。 Ansible 的…

Unity 设计模式 之 行为型模式-【命令模式】【责任链模式】

Unity 设计模式 之 行为型模式-【命令模式】【责任链模式】 目录 Unity 设计模式 之 行为型模式-【命令模式】【责任链模式】 一、简单介绍 二、命令模式&#xff08;Command Pattern&#xff09; 1、什么时候使用命令模式 2、使用命令模式的好处 3、使用时的注意事项 三…

OpenMV与STM32通信全面指南

目录 引言 一、OpenMV和STM32简介 1.1 OpenMV简介 1.2 STM32简介 二、通信协议概述 三、硬件连接 3.1 硬件准备 3.2 引脚连接 四、软件环境搭建 4.1 OpenMV IDE安装 4.2 STM32开发环境 五、UART通信实现 5.1 OpenMV端编程 5.2 STM32端编程 六、SPI通信实现 6.1 …

低代码可视化-UniApp二维码可视化-代码生成器

市面上提供了各种各样的二维码组件&#xff0c;做了一简单的uniapp二维码组件&#xff0c;二维码实现依赖davidshimjs/qrcodejs。 组件特点 跨浏览器支持&#xff1a;利用Canvas元素实现二维码的跨浏览器兼容性&#xff0c;兼容微信小程序、h5、app。 无依赖性&#xff1a;QR…

什么是 JWT?它是如何工作的?

松哥最近辅导了几个小伙伴秋招&#xff0c;有小伙伴在面小红书时遇到这个问题&#xff0c;这个问题想回答全面还是有些挑战&#xff0c;松哥结合之前的一篇旧文和大伙一起来聊聊。 一 无状态登录 1.1 什么是有状态 有状态服务&#xff0c;即服务端需要记录每次会话的客户端信…