第十章:C++ 标准
C++ 语言不断演进,每个新版本都引入了新的特性和改进。本章将详细介绍 C++11、C++14、C++17、C++20 和 C++23 的重要特性及其对 C++ 开发的影响。通过对这些标准的学习,读者可以掌握现代 C++ 编程的最新趋势,提高代码的可维护性、性能和可扩展性。
10.1 C++11:现代 C++ 的开端
C++11 标准是 C++ 语言历史上的一次重大更新,它引入了大量的新特性,使得 C++ 语言更加现代化和简洁。C++11 标准的目标是让 C++ 更加安全、表达力更强,同时提高代码的效率。
-
自动类型推导(auto)
auto关键字让编译器自动推导变量类型,减少冗余代码。- 示例:
auto x = 42; // x 的类型是 int auto pi = 3.14159; // pi 的类型是 double
-
范围-based for 循环
- C++11 引入了范围-based
for循环,简化了遍历容器的代码。 - 示例:
std::vector<int> vec = {1, 2, 3, 4, 5}; for (auto& value : vec) { std::cout << value << std::endl; }
- C++11 引入了范围-based
-
智能指针(
std::unique_ptr和std::shared_ptr)std::unique_ptr和std::shared_ptr自动管理资源,减少内存泄漏风险。- 示例:
std::unique_ptr<int> ptr = std::make_unique<int>(10); std::shared_ptr<int> sptr = std::make_shared<int>(20);
-
并发编程支持(
std::thread)- 引入了
std::thread类,使多线程编程更加简单。 - 示例:
void print() { std::cout << "Hello from thread!" << std::endl; } int main() { std::thread t(print); t.join(); }
- 引入了
-
右值引用与移动语义
- 右值引用 (
&&) 使得移动语义成为可能,提升性能,尤其是在大对象的复制过程中。 - 示例:
std::vector<int> make_vector() { std::vector<int> v = {1, 2, 3}; return v; // 使用移动语义 }
- 右值引用 (
-
Lambda 表达式
- Lambda 表达式使得匿名函数更加简洁,可以作为回调或线程任务。
- 示例:
auto add = [](int a, int b) { return a + b; }; std::cout << add(3, 4) << std::endl;
10.2 C++14:小的改进与修复
语言增强
- 泛型 lambda:允许
auto作为 lambda 参数类型,自动生成模板 lambda,如auto f = [](auto x, auto y){ return x+y; };([geeksforgeeks.org][1])。 - constexpr 函数放宽:支持更多语句(如循环、条件、局部变量),增强编译期计算能力 。
- 二进制字面量 (
0b1010) 和 数字分隔符 (1'000'000) 。
标准库更新
std::make_unique:弥补 C++11 缺失,为 unique_ptr 提供工厂函数 。- 异构查找:关联容器支持用不同但可比较类型进行查找,如
set<string>.find("foo")([zh.wikipedia.org][2])。 - 共享互斥锁 (
shared_timed_mutex) 与shared_lock([en.wikipedia.org][3])。 std::is_final、std::cbegin/cend等增强类型和迭代器支持 ([zh.wikipedia.org][2])。
10.3 C++17:更多现代化特性
语言特性
- 结构化绑定:支持
auto [a, b] = tuple_or_struct;([geeksforgeeks.org][1])。 - if/switch 带初始化语句,例如
if (auto it = v.find(x); it != v.end()) …([geeksforgeeks.org][4])。 - 模板类的参数推导:无需显式指定模板参数,如
std::pair p(1, 2);。 - inline 变量:支持头文件中常量的单一定义 ([geeksforgeeks.org][1])。
- 折叠表达式:简化变参模板,如
(… + args)。 - UTF‑8 字符字面量(
u8'…')、十六进制浮点数等 ([en.wikipedia.org][5])。 - 模板
template<auto>和 非类型模板参数推导 ([stackoverflow.com][6])。
标准库增强
std::optional,std::variant,std::any,std::string_view等新类型 ([zh.wikipedia.org][7])。- 零开销节点操作:支持
extract(),merge(),高效操作 map/set 元素 ([zh.wikipedia.org][7])。 - 并行 STL 算法 (
std::execution) 。 - 文件系统库 (
<filesystem>)、std::invoke,std::apply。
10.4 C++20:概念、协程与更强大的库
语言新特性
- Concepts:模板约束机制,如
template<Integral T>。 - 三路比较(spaceship operator
<=>):统一比较符号 。 - Ranges 库、range-based for 更优语义 ([geeksforgeeks.org][8])。
- Modules:替代 #include 的模块化系统 ([medium.com][9])。
- Coroutines:协程支持
co_await/co_yield/co_return([medium.com][9])。 consteval,constinit:编译时期的计算与初始化保证 。- import 关键字, 新的属性机制, 与 constexpr 投影变得更强 ([zh.wikipedia.org][2])。
库特性
- 时间/日历库(
<chrono>) 增强 。 std::to_array,std::likely/unlikely属性 ([geeksforgeeks.org][8])。- 字符串增强、浮点支持、概念库 等 ([reddit.com][10])。
10.5 C++23:渐进式增强
语言更新
- 简化隐式 move 规则,使代码更直观 ([cppstories.com][11])。
deducing this:方法中自动推导this的类型 ([en.cppreference.com][12])。if consteval:区分编译期与运行时分支 ([en.cppreference.com][12])。- 多维下标运算符(
a[i][j]可重载为二维) 。 - 预处理增强:
#elifdef,#warning支持 。 - 字符字面更严格,移除部分宽字符支持 。
标准库增强
std::format,std::println:格式化输出支持 。std::expected:替代异常处理或错误码 ([geeksforgeeks.org][13])。- flat_map, flat_set, mdspan, generator, spanstream, stacktrace ([geeksforgeeks.org][13])。
std::byteswap,std::to_underlying,std::move_only_function,std::unreachable等实用工具 ([geeksforgeeks.org][13])。- 可作 constexpr 的 std::unique_ptr、bitset、cmath funcs 等 。
- 单子操作:
optional/expected添加.and_then,.or_else等 ([zh.wikipedia.org][14])。
总结
📊 对比总结
| 特性领域 | C++14 | C++17 | C++20 | C++23 |
|---|---|---|---|---|
| 语言 | 泛型 lambda, 放宽 constexpr, 二进制字面量 | 结构化绑定, 折叠表达式, inline 变量, 模板推导 | Concepts, modules, coroutines, spaceship, ranges | 简化隐式 move, if consteval, deducing this, 多维下标 |
| 标准库 | make_unique, shared_mutex, 异构查找 | optional/variant/any/string_view, filesystem, 并行算法 | chrono 强化, ranges, to_array, 属性 | format/println, expected, flat_map, mdspan, generator, stacktrace… |
📌 小结
- C++14:主要是对 C++11 的补强,语言与库的细节优化。
- C++17:广泛提升可用性与简洁性,STL 增强和模板系统增强。
- C++20:一次重大巨变,引入概念、协程、模块、ranges,现代 C++ 的里程碑。
- C++23:进一步完善,强调可用性、性能和编译期能力,填补过去留下的空白。
72

被折叠的 条评论
为什么被折叠?



