左值和右值
综述
C++对于左值和右值没有标准定义,但是有一个被广泛认同的说法:
可以取地址的,有名字的,非临时的就是左值;——变量、返回引用、const
不能取地址的,没有名字的,临时的就是右值;——10、函数返回值
数(10),函数返回的值(.没名字、临时值)等都是右值;
而非匿名对象(包括变量),函数返回的引用,const对象等都是左值。
详细
1、左值指既能够出现在等号左边,也能出现在等号右边的变量;
右值则是只能出现在等号右边的变量。
int a; // a 为左值
a = 3; // 3 为右值
2、左值是可寻址的变量,有持久性;
右值一般是不可寻址的常量,或在表达式求值过程中创建的无名临时对象,短暂性的。
3、值和右值主要的区别之一是左值可以被修改,而右值不能。
左值引用和右值引用
传统左值引用
int a = 10;
int &b = a; // 定义一个左值引用变量
b = 20; // 通过左值引用修改引用内存的值
右值引用
正常情况下只能操作 C++ 中的左值,无法对右值添加引用
int num = 10;
int &b = num; //正确
int &c = 10;//错误
因为10无法进行取地址操作,无法对一个字面值常量取地址。
C++ 11 特性:右值引用
定义右值引用的格式如下:
只能绑定到一个将要销毁的对象,如果之后要用到它,避免了内存的拷贝,获得这个对象的所有权。
类型 && 引用名 = 右值表达式;
int num = 10;
//int && a = num; //右值引用不能初始化为左值
int && a = 10;
#include <iostream>
#include <string>
using namespace std;
string getMyName()
{
string name = "TM";
return name;
}
string printStr(string& str)
{
if (str.empty())
{
return str;
}
cout << str;
return str;
}
int main()
{
printStr(getMyName());//非常量引用的初始值必须为左值
//tring name = getMyName();
//printStr(name);
system("pause");
return 0;
}