一:
左值:能用在赋值等号的左侧的东西,能代表一个地址,必须有地址
右值:不能出现在,赋值语句的左侧。
结论:
1.c++的一条表达式,不是左值,就是右值,不可能两者都不是。
2.左值有的时候能够被当作右值使用。
i = i+1;//一个左值,可以同时具有左值和右值属性。
二:引用分类
左值引用:
没有空引用的说法
左值绑定到左值
左值必须绑定到有名字的变量(临时变量不可以如:“This is a string”)
const int &c = 1; //这个可以
右值引用:
必须绑定到右值的引用
int &&refrightvalue = 3; //绑定到一个常量
refrightvalue = 5;
const 引用(常量引用):
int v;
alue = 12;
const int&referval = value;
总结:
1.++i :直接个i加一,返回i本身,返回左值表达式
i++; 先用i,再加一。先产生临时变量,再给i加一,再返回临时变量的,右值表达式。
2.任何函数里面的形参都是左值 void f(int && w);
右值引用的目的:
提高程序运行效率:把拷贝对象变成移动对象来提高程序的运行效率。
移动构造函数,移动赋值运算符
三:std::move函数
移动:实际上没有做移动的操作
只有把一个左值强制转换成一个右值的能力。
string st = " i Lou=ve China" ;
const char *p = st.c_str();
string def = std::move(st) ; //sting里的移动构造函数把st的内容转移到了def中,而不是std::move移动了st
const char *q = def.c_str();
string &&deff = std::move(st); //不会使用移动构造函数。st并没有变。有的书要承诺:以后st不再使用
参考:网易云 精通c++111417 课程