La diferencia entre la referencia lvalue y la referencia rvalue en C ++

01 ¿Qué son lvalores y rvalues?

  • Valor de la izquierda: es una variable con una determinada dirección de memoria y un nombre, que se puede asignar y utilizar en múltiples declaraciones;
  • Rvalue: variable temporal sin nombre, no se puede asignar y solo puede aparecer en una declaración, como constantes literales y variables temporales .

02 ¿Cómo distinguir entre lvalue y rvalue?

Vea si puede abordar la expresión

能否用“取地址&”运算符获得对象的内存地址。
对于临时对象,它可以存储于寄存器中,所以是没办法用“取地址&”运算符;
对于常量,它可能被编码到机器指令的“立即数”中,所以是没办法用“取地址&”运算符;
这也是C/C++标准的规定。

Devuelve el valor de la expresión izquierda: 返回左值引用的函数、赋值、下标、解引用、前置递增/递减运算符.
Devuelve el valor de la expresión de la derecha: 返回非引用类型的函数、算术、关系、位、后置递增/递减运算符.
Por ejemplo:

int a = 5;
int b = 6;
int *ptr = &a; 
vector v1; 
string str1 = "hello " ;
string str2 = "world" ;
const int &m = 1 ;

a+b//临时对象
a++//右值,是先取出持久对象a的一份拷贝,再使持久对象a的值加1,最后返回那份拷贝,而那份拷贝是临时对象(不可以对其取地址),故其是右值。
++a//左值,使持久对象a的值加1,并返回那个持久对象a本身(可以对其取地址),故其是左值。
v1[0]//调用了重载的[]操作符,而[]操作符返回的是一个int &,为持久对象(可以对其取地址)是左值。
string("hello")//临时对象(不可以对其取地址),是右值;
str1+str2//调用了+操作符,而+操作符返回的是一个string(不可以对其取地址),故其为右值;
str1//左值
*p//左值

03 Referencias de Lvalue y referencias de rvalue

C ++ 11 introdujo referencias rvalue, c ++ 11 en un valor de referencia & representa una izquierda, una derecha && con valores de referencia.

int i = 2;//左值
int &a = i; //左值引用

int &&a = 10; //右值引用

De acuerdo con los diferentes modificadores, las referencias lvalue se pueden dividir en: lvalue no const, const lvalue ; referencia rvalue se puede dividir en: rvalue no const, rvalue const .

int i = 10;//非const左值
const int j = 20;

//非const左值引用
int &a = i;//非const左值引用 绑定到 非const左值,编译通过
int &a = j;//非const左值引用 绑定到 const左值,编译失败
int &a = 5;//非const左值引用 绑定到 右值,编译失败

//const左值引用
const int &b = i;//const左值引用 绑定到 非const左值,编译通过
const int &b = j;//const左值引用 绑定到 const左值,编译通过
const int &b = 5;//const左值引用 绑定到 右值,编译通过

//非const右值引用
int &&c = 30;//非const右值引用 绑定到 右值,编译通过
int &&c = i;//非const右值引用 绑定到 非const左值,编译失败(不能将一个右值引用绑定到左值上)

//const右值引用
const int &&d = 40;//const右值引用 绑定到 右值,编译通过
const int &&d = c;//const右值引用 绑定到 非常量右值,编译通过
  • Las referencias de lvalue no constantes solo se pueden vincular a lvalues ​​no constantes
  • Las referencias de valor r no constantes solo se pueden vincular a valores r no constantes

04 Resumen

  • Las referencias de非常量左值 lvalue no constantes solo se pueden vincular a , pero no a valores l constantes, valores r no constantes y valores r constantes;
  • Se pueden enlazar referencias constantes de lvalueconst左值、非const左值、const右值、非const右值 .
  • Las referencias de valor no constante solo se pueden vincular a 非const右值;
  • Las referencias const rvalue pueden vincularse const右值和非const右值.

Documentos de referencia

Supongo que te gusta

Origin blog.csdn.net/qq_41363459/article/details/113862371
Recomendado
Clasificación