以前记得学过,后来又忘了,现在做一个总结;
一、左右值基本定义:
简而言之,左值就是指那些拥有地址,在存储单元内存储数值的变量,可以通过变量名去访问;
而右值这事中间的临时变量,无法通过地址进行访问,表达式或者生存周期结束之后就被彻底销毁;
这里右值还分为两种:
1.纯右值:非引用返回的临时变量( int func(void) )、运算表达式产生的临时变量(b+c)、原始字面量(2)、lambda表达式等;
2.将亡值:将要被移动的对象、T&&函数返回值、std::move返回值和转换为T&&的类型的转换函数的返回值;
因此可以看到,右值无法通过传统的变量进行访问或者赋值;
二、左值引用和右值引用:
左右值也可以通过引用来进行访问;
1.左值引用:
左值引用比较熟悉,就是一个变量的别名而已,不开辟其他空间;
但是左值引用既可以引用左值,也可以引用右值;
例如对于典型的函数传参 const type&,就可以直接接受右值;
int &a = 2; // 非常量左值引用 绑定到 右值,编译失败
int b = 2; // b 是非常量左值
const int &c = b; // 常量左值引用 绑定到 非常量左值,编译通过
const int d = 2; // d 是常量左值
const int &e = d; // 常量左值引用 绑定到 常量左值,编译通过
const int &f =2; // 常量左值引用 绑定到 右值,编译通过
2.右值引用:
右值引用可以通过接受一个右值,使其延长生存周期,只要该变量存在,临时右值就不会被销毁;
右值引用一般接收右值或者move后的左值(也就是直接将左值数据夺取后的右值);
int a;
int &&r1 = a; // 编译失败
int &&r2 = std::move(a); // 编译通过
值得注意的是,关于右值引用变量类型是右值引用,但是其变量是左值,这点在Modern Effective C++条款一有提到过;