第十章:C++ 标准

第十章: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;
      }
      
  • 智能指针(std::unique_ptrstd::shared_ptr

    • std::unique_ptrstd::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_finalstd::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++14C++17C++20C++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:进一步完善,强调可用性、性能和编译期能力,填补过去留下的空白。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weisonx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值