C++不同版本特性差异
·
C++不同版本特性差异
概述
C++ 自 1998 年首次标准化以来,经历了多次重大更新。每个新标准都引入了语言特性和标准库的增强,显著提升了开发效率、性能和安全性。
核心特性对比
以下是 C++ 各主要版本(C++98/03 → C++23)的核心特性对比,按版本清晰梳理:
| 版本 | 发布年份 | 关键语言特性 | 标准库新增/增强 |
|---|---|---|---|
| C++98 / C++03 | 1998 / 2003 | - 命名空间 (namespace) - 异常处理 (try/catch) - 模板 (Templates) - bool 类型 - RTTI (dynamic_cast, typeid) |
- STL(vector, map, algorithm 等) - I/O 流 (iostream) |
| C++11(现代 C++ 起点) | 2011 | - auto / decltype - Lambda 表达式 [](){} - 右值引用 & 移动语义 (&&, std::move) - nullptr - 范围 for 循环 for (auto x : v) - constexpr(编译期常量) - 可变参数模板 - 统一初始化 {} - static_assert |
- 智能指针:unique_ptr, shared_ptr - 线程支持:thread, mutex - unordered_map/set - chrono 时间库 - array, tuple |
| C++14(C++11 的完善) | 2014 | - 泛型 Lambda([](auto x){}) - 函数返回类型自动推导(auto f() { return 42; }) - decltype(auto) - 二进制字面量 0b1010 - 数字分隔符 1'000'000 - 放宽 constexpr(允许循环、分支) |
- make_unique - 更灵活的 integral_constant |
| C++17(实用主义飞跃) | 2017 | - 结构化绑定 auto [x, y] = pair; - if/switch 初始化语句 - if constexpr(编译期条件) - 折叠表达式 (args + ...) - 内联变量 inline constexpr int x = 5; - [[nodiscard]], [[maybe_unused]] 属性 |
- optional, variant, any - string_view(非拥有字符串视图) - filesystem(文件操作) - 并行算法(execution::par) |
| C++20(现代化大升级) | 2020 | - Concepts(模板约束) - Modules(替代头文件) - 协程(co_await, co_yield) - 三向比较 <=>(“太空船运算符”) - 范围 for 支持初始化 - Lambda 模板参数 [](T x){} - constexpr 几乎支持全部语法 |
- Ranges 库(views::filter, views::transform) - span(连续内存视图) - 日历与时区( 扩展) - 同步原语:latch, barrier, semaphore - format(类似 Python f-string,但正式加入在 C++20 提案,C++23 定稿) |
| C++23(最新标准) | 2024 | - if consteval(检测是否在常量求值上下文) - 多维下标 obj[i, j] - Lambda 改进(捕获参数包、推导 this) - 扩展 constexpr(更多 STL 算法支持) |
- std::print / std::println(直接输出,无需 iostream) - std::expected |
重点说明
- C++11 是分水岭:引入了现代 C++ 编程范式(自动类型、Lambda、移动语义、智能指针等),后续版本基本是其演进。
- C++14 较小:主要是对 C++11 的“甜味剂”(syntactic sugar)和小幅增强。
- C++17 更注重实用性:如 optional 避免空指针、filesystem 解决跨平台文件操作痛点。
- C++20 是革命性版本:Concepts 让模板更安全,Ranges 简化算法组合,Modules 提升编译速度。
- C++23 聚焦易用性与工程化:std::print 简化输出,expected 提供无异常错误处理方案。
查看当前编译器支持标准
如何查看当前编译器支持的 C++ 标准?
#include <iostream>
int main() {
std::cout << "__cplusplus = " << __cplusplus << std::endl;
return 0;
}
对应关系:
- 199711L → C++98
- 201103L → C++11
- 201402L → C++14
- 201703L → C++17
- 202002L → C++20
- 202302L → C++23
更多推荐



所有评论(0)