第一节 · 划分领地 · 命名空间
C++11 引入的右值引用和移动语义是语言演进中最重要的特性之一,它们彻底改变了资源管理的方式。
左值与右值
int main()
{
int x = 10; // x 是左值,10 是右值
int y = x + 1; // x + 1 是右值
// 左值:有名字,可以取地址
int* p = &x; // OK
// 右值:临时的,不可取地址
// int* p2 = &(x + 1); // 错误
return 0;
}右值引用
int main()
{
int x = 10;
// 左值引用
int& lref = x;
// int& lref2 = 10; // 错误:不能绑定到右值
// const 左值引用可以绑定右值
const int& clref = 10; // OK
// 右值引用
int&& rref = 10; // OK
// int&& rref2 = x; // 错误:不能绑定到左值
// 右值引用本身是左值!
int&& rref3 = move(x); // 用 move 将左值转为右值
return 0;
}移动语义的动机
移动构造函数
移动赋值运算符
std::move
完美转发
引用折叠
移动语义与容器
移动-only 类型
noexcept 的重要性
习题
解释左值、右值、纯右值、将亡值的区别。
为一个资源管理类实现移动语义。
解释为什么移动后的对象应该处于有效状态。
Last updated