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++ 的工程基线自这里开始。