C++ 语言自从其诞生以来,经历了多个版本的更新,每个版本都引入了新的特性和改进,目的是提升语言的表达能力、性能、安全性以及开发效率。下面是各个主要版本(从 C++98 到 C++20)的一些关键特性。
C++98 (1998年)
- ISO C++ 标准化:C++98 是第一个国际标准化的版本,定义了 C++ 语言的核心规范。
- STL(标准模板库):在 C++98 中,STL 已经成为标准库的一部分,提供了数据结构(如
vector
、list
、map
)和算法。 - 异常处理:C++98 规范了异常处理机制(
try
、catch
、throw
)。
C++03 (2003年)
- 小范围改进:C++03 并没有引入重大的新特性,而是主要进行了一些小的修正和澄清,修复了 C++98 中的一些错误和不一致性。
- 编译器兼容性改进:增强了跨平台的兼容性,避免了 C++98 中的一些模糊或不确定的行为。
C++11 (2011年)
C++11 是一个重大更新,带来了大量的新特性,使得 C++ 更加强大和现代化。
- 自动类型推断(
auto
):允许编译器根据初始化表达式推断变量类型。 - 范围-based for 循环:简化了遍历容器的语法。
- 智能指针:引入了
std::unique_ptr
和std::shared_ptr
等智能指针,简化了内存管理。 - lambda 表达式:支持匿名函数,使得代码更加简洁和灵活。
- 并发支持:引入了
<thread>
头文件和std::thread
,让 C++ 支持原生线程并行编程。 - 右值引用和移动语义:引入了右值引用(
&&
)和std::move
,显著提升了性能,尤其在传递和返回大型对象时。 - constexpr:支持常量表达式,使得一些计算可以在编译时完成。
C++14 (2014年)
- 小改进与修复:C++14 主要是对 C++11 的补充和修复,解决了一些问题和改进了一些特性。
- Lambda 捕获扩展:允许在 lambda 表达式中捕获
*this
。 std::make_unique
:引入std::make_unique
用来创建std::unique_ptr
,避免手动使用new
。auto
的推导增强:在某些场景下,auto
可以推导更加复杂的类型。
C++17 (2017年)
C++17 引入了许多实用的功能和语言改进,进一步增强了 C++ 的表现力。
- 结构化绑定声明:可以将一个元组或者结构体分解为多个变量,例如
auto [x, y] = get_coords();
。 std::optional
、std::variant
和std::any
:为处理空值、不同类型或不确定类型的值提供了标准库支持。if
和switch
中的初始化语句:允许在if
或switch
语句中直接声明变量。- 并发改进:
std::shared_mutex
引入了读写锁(读多写少时有效)。 std::filesystem
:提供了文件系统操作的标准库支持。std::string_view
:允许创建非拥有型的字符串视图,避免了不必要的内存复制。
C++20 (2020年)
C++20 是一个具有革命性的更新,带来了许多现代化的特性和语言增强。
- 概念(Concepts):引入了概念,提供了类型约束机制,让模板编程更安全、可读和可维护。
- 范围库(Ranges):为处理序列数据提供了更加高效和简洁的方式,可以用
view
、action
等进行链式操作。 - 模块(Modules):提供了比传统头文件更高效的代码组织方式,减少了编译时间。
- 协程(Coroutines):支持协程,让异步编程更加简单直观。
- 三向比较操作符(Spaceship Operator
<=>
):引入了三向比较符号,简化了比较操作符的定义,尤其在排序时非常有用。 consteval
和constinit
:增强了对常量表达式和常量初始化的支持。std::format
:提供了类似 Python 的字符串格式化方法。std::span
:提供了一个轻量级的视图类,用于处理数组或容器的子集。
C++23 (2023年)
C++23 继续增强了语言的现代化和开发效率,主要改进包括:
- 增强的范围库:范围库得到进一步扩展和优化,增加了更多实用的操作符和功能。
std::expected
:类似于std::optional
,但可以表示期望的结果,包含成功或失败的状态。constexpr
扩展:支持更多的标准库函数和语言特性在编译时计算。- 正则表达式改进:引入了更高效和更灵活的正则表达式 API。
- 提高的标准库支持:增加了更多的标准库函数、算法和容器的优化。
总结
C++ 的每个版本都在逐步提升语言的表达能力、开发效率和执行性能。从 C++98 到 C++20,我们可以看到语言逐步引入了现代编程的诸多特性,如自动化内存管理、并发支持、类型系统改进、以及更易用的标准库。这些特性不仅增强了语言的功能性,也使得 C++ 编程变得更加灵活和高效。