• Index

左值引用和右值引用

Reads: 16

前一篇教程所说的引用,全名叫做左值引用。以下将讲解左值和右值,还有左值引用右值引用。至于为什么要用引用,将在下一篇教程讲解。

左值和右值

区分左值和右值的简单方法:

int a = 0; // 0是值, 值没有名字所以是右值; a是变量名, 因为是名字所以是左值
int b = std::abs(1024); // 函数的返回值, 没有名字所以是右值; b是变量名所以是左值
int c = a; // a是右值, c是变量名所以也是左值

也就是说,区分左值和右值的简单方法就是这个东西有没有名字

左值引用和右值引用

左值引用就是左值的引用,即上一篇教程所说的内容,由于历史原因一般简称引用

int a = 0; // a是左值
int &b = a; // b是左值a的引用, b保存的内容发生改变时, a保存的内容也会随之改变

右值引用就是右值的引用,使用数据类型 &&来声明:

int &&a = 0; // 0是右值, 可以用右值引用来保存
int &&b = std::abs(1024); // 返回值是右值, 可以用右值引用来保存

// a虽然是右值的引用, 但是a已经是名字了, 也就是左值
// 所以要用左值引用而不能使用右值引用
int &c = a; 

因为右值引用是右值的别名,所以声明的时候也需要初始化。

然而,int &&a = 0;int a = 0;一样,int &&b = std::abs(1024);int b = std::abs(1024);一样,所以聪明的你会发现,右值引用就是只能接收右值的普通变量

右值引用并不是这样使用的,右值引用的用途,基本上都用在函数参数上,并且与左值引用进行区分,用来优化程序

使用const

const作用在左值引用:

int a = 0;
const int &b = a; // b是a的别名, 但是不能通过b来改变a的值
a = 1024; // b的值随之改变
// b = 6666; // 去掉开头注释将会报错, 因为受到const的限制, b是只读的

const作用在右值引用:

const int &&a = 0; // 实际上就是 const int a = 0;

补充知识(了解即可)

C++为了对右值进行优化,从C++11开始引入左值和右值的概念,此前并没有这样的概念,C++11前左值引用只叫做引用。


Comments

Make a comment

  • Index

WARNING: You are using an old browser that does not support HTML5. Please choose a modern browser (Chrome / Microsoft Edge / Firefox / Sarafi) to get a good experience.