C++ 右值引用与移动语义详解
在 C++11 引入右值引用之前,我们主要关注左值。随着性能要求的提升,如何避免不必要的对象拷贝成为了关键。本文将深入探讨右值引用、移动语义以及万能引用的实际应用。
一、左值和左值引用
左值是一个表示数据的表达式,比如变量名或解引用后的指针。我们可以获取它的地址,也可以对它进行赋值操作。左值可以出现在赋值符号的左边,而右值不能。
int main() {
// 左值
int* p = new int(0);
int b = 1;
const int c = 2;
// 左值引用
int*& rp = p;
int& rb = b;
const int& rc = c;
int& pvalue = *p;
return 0;
}
左值引用本质上就是给左值取别名。需要注意的是,const 修饰后的左值虽然不能直接赋值,但仍然可以取地址。
二、右值和右值引用
右值通常指临时数据,如字面常量、表达式的返回值等。右值可以出现在赋值符号右边,但不能出现在左边,且通常无法取地址。
string to_string(int val) {
string str;
// ... 省略实现细节
return str;
}
int main() {
double x = 1.1, y = 2.2;
// 常见的右值
10;
x + y;
// 对右值的右值引用
int&& rr1 = 10;
double&& rr2 = x + y;
string&& rref3 = string("1111");
string&& rref4 = ();
;
}


