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<int> v1{0, 1};
std::vector<int> v2(std::move(v1));
std::cout << v2.size() << std::endl;
std::cout << v1.size() << std::endl;
上面代码中,move将v1变成右值引用,使得构造v2的时可以使用vector的移动构造函数,在此过程中释放了v1的数据,所以输出的结果是2和0