Loading

C++左值右值

定义与区别

左值 (lvalue, locator value) 表示了一个占据内存中某个可识别的位置(也就是一个地址)的对象。即左值指的是可以取地址的变量。

区分表达式的左右值属性有一个简便方法:若可对表达式用 & 符取址,则为左值,否则为右值。左值与右值的根本区别在于能否获取内存地址,而能否赋值不是区分的依据。

const int a = 10; // 'a' 是左值
a = 10;           // 但不可以赋值给它!

左值与右值直接的转换

一般上讲,对象之间的运算,对象是以右值的形式参与的。表示数组函数非完整类型的左值是不能转换为右值的,因为无法对那些类型进行求值。

int a = 1;     // a 是左值
int b = 2;     // b 是左值
int c = a + b; // a和b自动转换为右值求和

右值可以通过一些更显式的方法产生左值。例如,一元解引用操作符 '*' 需要一个右值参数,但返回一个左值结果。

int arr[] = {1, 2};
int* p = &arr[0];
*(p + 1) = 10;   // 正确: p + 1 是右值,但 *(p + 1) 是左值

相反地,一元取地址操作符 '&' 需要一个左值参数,返回一个右值:

int var = 10;
int* bad_addr = &(var + 1); // 错误: 一元 '&' 操作符需要左值参数
int* addr = &var;           // 正确: var 是左值
&var = 40;                  // 错误: 赋值操作的左操作数需要是左值

左值引用

C++中可以使用&符定义引用,如果一个左值同时是引用,就称为“左值引用”。

std::string s;
std::string& sref = s;  //sref为左值引用

非const左值引用 不能使用右值对其赋值。但 const左值引用 可以。

解析】非const引用类型的变量是可以后续对其进行赋值操作的,但是右值是不可获取内存地址。但const左值引用不一样,因为常量不能被修改,也就不存在上述问题。

std::string& r = std::string(); //错误!std::string()产生一个临时对象,为右值
const std::string& r = std::string(); //可以

因此,我们经常使用const左值引用作为函数的参数类型,可以减少不必要的对象复制

C++11 右值引用

参考:

参考

理解 C/C++ 中的左值和右值

posted @ 2021-11-25 17:02  JakeLin  阅读(182)  评论(0编辑  收藏  举报