第一节 · 划分领地 · 命名空间

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