C++拷贝控制

Outline:

  • 对象移动
  • //TODO

对象移动

右值引用

  • 左值引用绑定到返回左值的表达式

    右值引用或const的左值引用绑定到返回右值的表达式

  • 右值要么是字面常量,要么是临时对象。右值引用只能绑定到右值,所以可以接管所引用对象的资源

    • 所引用对象将要被销毁
    • 该对象没有其它用户
  • 变量是左值

    • 不能把右值引用直接绑定到一个变量,即使这个变量是右值引用类型
    1
    2
    int &&rr1 = 42;
    int &&rr2 = rr1; //错误: rr1是右值引用类型的变量,它是个左值
  • move()左值转换为右值引用.

    1
    int && rr3 = std::move(rr1);
    • 可以销毁移后源对象,可以赋予其新值,但不能使用移后源对象的值
    • move不提供using声明, 直接调用std::move而非move
    • 在头文件<utility>

移动构造函数和移动赋值运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class X
{
int a;
public:
X(int x)
{
a = x;
}

//委托构造
X()
: x(42)
{}

};