C++11:左值、右值、左值引用、右值引用有什么区别?

文章目录

  • 1.左值(lvalue)
  • 2.右值(rvalue)
  • 3.左值引用(lvalue reference)
  • 4.右值引用(rvalue reference)

1.左值(lvalue)

左值是一个可以标识并在表达式中使用的对象。简单说,左值就是具有名称且位于内存中的对象或表达式。左值可以出现在赋值运算符的左边或右边,并且具有持久的生命周期。

例如,变量函数返回的左值引用数组元素类成员等都是左值。

2.右值(rvalue)

右值是指没有名称临时创建的对象,其生命周期仅限于当前表达式。右值通常是一个临时值或表达式的结果。右值不能出现在赋值运算符的左边。

例如,字面量临时对象表达式的结果等都是右值。

3.左值引用(lvalue reference)

左值引用是指对左值的引用,可以将左值绑定到左值引用上。左值引用通过使用 & 符号声明,并表示对某个具名对象的别名。

int x = 5; int& ref = x; // ref 是对 x 的左值引用。

//左值引用
int a=10;
int &a1=a;//正确,a为左值类型,因为可以我们找到他的地址
int &a=10;//错误,左值引用不能引用一个右值类型的常量,(10是常量,常量为右值)

编译器允许我们对左值建立引用,但不允许对右值建立引用。除非使用常量左值引用操作右值

int num = 10;
const int &b = num;
const int &c = 10;

4.右值引用(rvalue reference)

右值引用是指对右值的引用,可以将右值绑定到右值引用上。右值引用通过使用 && 符号声明,并表示对某个右值的别名

int&& rref = 42; // rref 是对临时整数值 42 的右值引用。

//右值引用
int &&a=10;//正确,右值引用一个右值类型
a = 100;
cout << a << endl;//100
 
int var = 10;
int&& var1 = var;//错误,因为无法将右值引用绑定到左值上
//右值引用绝对不能引用左值类型的,加上const也不行,这点是和左值引用不同的地方
const int&& var1 = var//照样报错,加上const也不行
 
//非引用返回的函数返回的都是右值,引用返回的函数返回的是左值
int fun1() { }
int &fun2() { }
int main()
{
	int& z = fun1();//左值引用,报错
	const int& z1 = fun1();//正确
	int&& z2 = fun1();//正确
 
    int& z = fun2();//左值引用,正确
	const int& z1 = fun2();//延长生命期的左值引用,正确
	int&& z2 = fun2();//报错,右值引用不能绑定左值
	const int&& z2 = fun2();//报错
}

参考链接这里

你可能感兴趣的:(燃犀的C++笔记,c++,java,开发语言)