C++: 右值、右值引用与move

1. 右值

在C++11中,所有变量被分为三种:左值、将亡值、纯右值

  • 左值:可以取地址的变量
  • 将亡值:将要被移动的对象、T&&函数返回值、std::move返回值和转换为T&&的类型的转换函数的返回值等
  • 右值:非引用返回的临时变量、运算表达式产生的临时变量、原始字面量和lambda表达式等

2. 右值引用

因为右值是不能显示看到的,所以只能通过引用去找到它。引用一个右值的变量则是右值引用,所以右值引用本身也可以是一个右值或是左值

int&& var = 1; 

如上,常数1是右值,var是一个右值引用,但它本身是一个左值

3. move

将一个左值强制转换为一个右值引用

4. 移动构造函数

参数为右值引用的构造函数:

A (A && a);

a是一个右值引用,在离开这个构造函数的时候其将被析构,所以尽量在这个构造函数里利用它以减少复制,如

A a(getA());

getA()返回一个右值的对象a,此时调用了移动构造函数,在移动构造函数将这个右值的东西抢救出来,另一个例子:

    std::vector v1{0, 1};
    std::vector v2(std::move(v1));
    std::cout << v2.size() << std::endl;
    std::cout << v1.size() << std::endl;

上面代码中,move将v1变成右值引用,使得构造v2的时可以使用vector的移动构造函数,在此过程中释放了v1的数据,所以输出的结果是2和0

你可能感兴趣的:(C++: 右值、右值引用与move)