C++11 右值引用与移动语义详解
C++11 的历史背景
C++11 是 C++ 标准自 C++98 以来最重要的更新之一。在 ISO 于 2011 年正式采纳前,它曾被称为 C++0x。这次更新标准化了许多实践,并引入了大量新特性,显著提升了 C++ 的抽象能力和性能表现。
参考资源:
- cplusplus.com (C++98/11 基础)
- cppreference.com (准官方文档,持续更新)
- isocpp.org (标准委员会论坛)
编译器对标准的跟进通常有滞后性。例如 C++23 虽然已发布,但多数生产环境仍停留在 C++11/14/17。理解底层机制有助于编写兼容性好且高效的代码。
列表初始化:{} 的统一化
C++98 中的初始化
在旧标准中,数组和结构体通常使用 0 或构造函数进行初始化,语法较为分散。
C++11 的 {} 初始化
C++11 引入了列表初始化(List Initialization),试图实现'一切对象皆可用 {} 初始化'。这不仅适用于内置类型,也适用于自定义类型。
int i = {1}; // 省略了 =
std::vector<int> v = {1, 2, 3};
对于自定义类型,这本质上是类型转换,中间可能产生临时对象,但在优化后通常变为直接构造。容器如 std::vector 支持通过 std::initializer_list 接受任意数量的参数进行初始化。
std::initializer_list
当需要传递一组值给函数或构造函数时,std::initializer_list 提供了便利。其底层是一个指向数组的指针对(begin/end),支持迭代器遍历。
auto il = {10, 20, 30}; // 类型为 std::initializer_list<int>
引用机制:左值与右值
概念区分
- 左值 (Lvalue):表示数据的表达式,通常具有持久状态,可以取地址。例如变量名、解引用的指针。它可以出现在赋值符号左边。
- 右值 (Rvalue):通常是字面常量或临时对象,不能取地址。一般出现在赋值符号右边。
int a = 10;
int& lref = a;
&& rref = ;
& good = ;


