c++中的左值和右值,右值引用到底是什么?关于引用这一节看得很迷糊。
展开全部
左值 顾名思义 等号左边的值。其实左值和右值是C++里面比较基础且严谨的概念(具体的完整定义自己查书吧,我也背不下来。),一般在老外的书里常提,国产渣书几乎没这个词。
下面是我自己的理解:其实左值就是可以赋值的值,基本上就用户定义的变量。右值就是等号右边的。可以是变量,也可以是常量。
比如 int a = 5; int b = a;
a,b都是用户定义的变量,可以随便赋值。5是字面值常量。 你可以对a,b求地址 比如 int* p = &a;
但是你不能对5求地址。 比如int *p = &5;
另外 C++ primer里面提到 前缀++返回左值,后缀返回右值。也可以通过左值与右值的概念来理解++操作法。比如 ++a = 10; 可以编译通过 (a++) = 10; 编译错误。同样 你也不能对 (a++)的值取地址。
其他的右值概念比如 函数的返回值等 也不能取地址。
右值引用是C++11中的概念,目的就是解决上面所说的函数返回值等问题。比如你返回了一个vector,可能包含很多元素,一次return就会产生一个临时变量,需要构造与析构。而实际上你可能只是这样写 vector ret = getVector(); 本身的ret还需要从临时的返回值里面再构造一次。产生浪费。C++ 11里面配合MOVE语义可以解决这种情况。 具体的我也说不太明白了,总之这个是C++新特性。
下面是我自己的理解:其实左值就是可以赋值的值,基本上就用户定义的变量。右值就是等号右边的。可以是变量,也可以是常量。
比如 int a = 5; int b = a;
a,b都是用户定义的变量,可以随便赋值。5是字面值常量。 你可以对a,b求地址 比如 int* p = &a;
但是你不能对5求地址。 比如int *p = &5;
另外 C++ primer里面提到 前缀++返回左值,后缀返回右值。也可以通过左值与右值的概念来理解++操作法。比如 ++a = 10; 可以编译通过 (a++) = 10; 编译错误。同样 你也不能对 (a++)的值取地址。
其他的右值概念比如 函数的返回值等 也不能取地址。
右值引用是C++11中的概念,目的就是解决上面所说的函数返回值等问题。比如你返回了一个vector,可能包含很多元素,一次return就会产生一个临时变量,需要构造与析构。而实际上你可能只是这样写 vector ret = getVector(); 本身的ret还需要从临时的返回值里面再构造一次。产生浪费。C++ 11里面配合MOVE语义可以解决这种情况。 具体的我也说不太明白了,总之这个是C++新特性。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询