C++11 右值引用与移动语义详解
前情提示
在深入右值引用之前,建议熟悉以下参考文档以辅助理解:
- 准官方参考文档:cppreference(推荐,同步更新)
- 标准 C++:isocpp.org(社区讨论为主)
注意:legacy.cplusplus.com 仅适用于 C++98/11 早期版本,后续标准已不再维护。
1. C++11 的历史发展
C++11 是 C++ 自 C++98 以来最重要的更新。它标准化了许多实践,并引入了大量新特性。在最终由 ISO 于 2011 年采纳前,该项目曾被称为'C++0x'。
1.1 版本迭代策略
C++03 与 C++11 之间间隔了约 8 年。此前委员会曾尝试制定 C++08,但因规划过大、特性过多导致延期。此后,C++ 确立了每 3 年发布一次新标准的节奏。
1.2 编译器支持情况
语言标准被广泛使用通常有 5~10 年的缓冲期。目前大多数公司仍在使用 C++11 或 C++14,部分企业开始采用 C++17。C++23 等新特性因上层库完善度不足,普及率尚低。
不同编译器对特性的支持程度不同,例如 VS (MSVC) 和 Clang 的进度可能不一致。开发时需注意目标环境的编译器版本。
2. 列表初始化:{}
2.1 C++98 中的初始化
在 C++98 中,数组和结构体通常使用 0 进行初始化,语法较为分散。
2.2 C++11 的统一初始化
C++11 引入 {} 初始化(列表初始化),旨在实现一切对象皆可统一初始化。内置类型和自定义类型均支持,本质涉及临时对象的构造与优化。
int i = {1}; // 省略等号
int j{2}; // 直接初始化
Date d{2025, 11, 15}; // 自定义类型
2.3 std::initializer_list
对于容器初始化,C++11 提供了 std::initializer_list。底层通过指针管理数据,支持任意数量的值初始化。
auto il = {10, 20, 30}; // 类型为 initializer_list<int>
vector<int> v = {1, 2, 3};


