左值、右值、左值引用和右值引用
在C++11里值要么是左值,要么是右值。
左值:能被取地址的、有名称的值。
右值:不能被取地址的值,包括临时变量,函数的返回值
int a=2;//a是左值,2是右值
int b=3;//b是左值,3是右值
int c=(a+b);//c是左值,(a+b)是右值
左值引用(C++98允许的引用):
语法:数据类型 & 数据名称=左值;
右值引用(C++11新增特性):
语法:数据类型&& 数据名称=右值;
- 左值引用对应左值,右值引用对应右值
int a = 2;
int b = 3;
int& d = (a + b);//编译错误,(a+b)是一个右值,不能进行左值引用
int&& e=a;//编译错误,a是个左值,不能进行右值引用
int&& c=(a+b);//编译通过,c代表的是值5,即使a或者b改变,c也不会改变
在int t=(a+b);这个语句中会先生成一个(a+b)的临时变量,将临时变量的值赋给t,在这一行代码执行完后就会消去临时变量。通过int&& c=(a+b)实际上是将这个临时变量的生命周期延长了。只要c的生命周期不结束,这个临时变量就存活下去。
- 左值引用和右值引用都必须立即初始化。
- 左值引用和右值引用都是给变量起别名,左值引用是给具名变量起别名,右值引用是给匿名变量起别名。
std::move
头文件:utility.h
std::move的作用:std::move可以将一个左值强制转换为右值引用,相当于static_cast<T&&>(lvalue)。
int a=2;
int&& e=std::move(a);//编译通过
被转换的左值,生命周期并没有随着左右值的转化而转变。左值lvaule并不会被立即析构。