跳转至

C++11新特性

建立现代 C++ 的起点认知,先把“为什么要学 C++11”与“它主要替代什么旧写法”理清。

目标:看到一个 C++11 特性时,先能判断它解决的是类型书写、资源管理、编译期表达还是并发基础问题,并能知道它主要在替代哪类旧时代写法。

1 语言基础能力

解决:类型书写冗长、空值语义不清、遍历写法繁琐、接口意图表达不足

  • auto —— 自动类型推导
    替代:显式长类型声明

  • decltype —— 表达式类型推导
    替代:模板上下文中手写复杂类型

  • nullptr —— 空指针字面量
    替代:NULL、0

  • range-based for —— 范围 for
    替代:下标遍历、迭代器样板代码

  • lambda —— 匿名函数对象
    替代:手写仿函数、零散回调函数

  • enum class —— 强类型枚举
    替代:传统 enum 污染作用域、隐式转整型

  • using —— 类型别名新写法
    替代:typedef

  • override / final —— 虚函数覆写约束
    替代:仅靠人工判断覆写关系

  • 列表初始化 —— 统一初始化语法
    替代:圆括号初始化、易窄化初始化

C++11 先把“代码能不能更清晰地表达意图”这件事拉到语言层。
类型更少手写,接口语义更明确,基础语法开始现代化。

2 资源管理与值语义

解决:资源生命周期不稳定、对象拷贝成本高、临时值无法高效利用

  • std::unique_ptr —— 独占所有权
    替代:裸 new / delete、手工释放

  • std::shared_ptr —— 共享所有权
    替代:多处手工协调对象生命周期

  • std::weak_ptr —— 非拥有弱引用
    替代:shared_ptr 循环引用、悬垂观察者

  • 右值引用 —— 临时对象绑定能力
    替代:只能按左值体系处理对象

  • 移动语义 —— 资源转移而非深拷贝
    替代:不必要拷贝、容器扩容时高成本复制

  • std::move —— 显式转为右值
    替代:隐式等待编译器猜测转移语义

  • std::forward —— 完美转发
    替代:模板包装层丢失值类别

C++11 的核心转折之一,是把资源管理从“约定”推进为“类型系统表达”。
对象不再只是能不能拷贝,而是开始区分拥有、共享、转移与转发。

3 编译期与模板基础

解决:编译期计算能力弱、泛型接口表达贫乏、模板参数扩展不自然

  • constexpr —— 编译期常量表达式
    替代:宏常量、弱编译期函数能力

  • variadic templates —— 可变参数模板
    替代:参数个数展开模板、C 风格可变参数

  • type traits 基础 —— 类型特征判断
    替代:手工模板分发、弱约束元编程

  • std::function —— 通用可调用对象封装
    替代:函数指针、接口不统一的回调类型

  • std::bind —— 参数绑定适配
    替代:手写适配器、回调包装样板代码

C++11 让模板不再只服务于容器与算法,也开始服务于更完整的泛型接口组织。
虽然这一阶段表达仍偏重,但现代模板体系的基础已经立起来。

4 并发与时间库

解决:线程能力依赖平台接口、加锁方式粗糙、等待与时间表达缺少统一标准

  • std::thread —— 标准线程对象
    替代:平台私有线程 API

  • std::mutex —— 互斥锁
    替代:平台私有锁接口

  • std::lock_guard —— RAII 加锁保护
    替代:手工 lock / unlock

  • std::condition_variable —— 条件变量
    替代:轮询、自旋、平台专有等待机制

  • std::future —— 异步结果通道
    替代:手工共享状态传递

  • std::async —— 标准异步启动接口
    替代:手工线程封装任务执行

  • std::chrono —— 标准时间库
    替代:平台时间 API、裸整数表示时间

C++11 把并发基础设施正式纳入标准库。
从线程、锁、等待到时间表达,现代 C++ 的工程基线自这里开始。