学习笔记:C++右值引用

之前阅读C++官方文档的时候,经常看到类似于这样的函数原型:

void f(string&& s);

之前不知道两个&&是什么意思,还以为是引用的引用,类似于二级指针的东西。。。。。。

后来参考了这篇文章https://eli.thegreenplace.net/2011/12/15/understanding-lvalues-and-rvalues-in-c-and-c/

我这篇文章所有例子都拿类A来举例:

class A{
public:
	A(){
		cout<<"constructor"<<endl;
	}
	void P(){
                cout<<this<<endl;
		cout<<"print"<<endl;
	}
	~A(){
		cout<<"destroy"<<endl;
	}

};

明白了这个是右值引用。首先需要明确一下左值和右值的定义:

左值:在内存中,有位置标识的对象(例如地址)。我们新建一个对象: A obj;那么&obj就是obj在内存的地址,所以obj在内存中有位置标识,所以obj是一个左值。

右值通过排他性定义,不是左值就是右值。

A()就是一个右值,这是一个临时的A对象,但是&(A())是非法的,编译会报错"taking address of temporary"。这个临时对象在内存中没有位置标识,这个对象是右值对象,但是这个右值对象确实是保存在内存中的,我们执行这样一条语句:

A().P();

this指向临时的这个A对象,确实输出了这个临时的A对象的地址。而且执行完这条语句后,就销毁了这个临时对象,输出了destory。

其他的例如:

int a=2;
(a+2)=3;//error

a+2也是一个右值,a+2的结果有可能只会保存在CPU的寄存器中,不保存在内存中,所以说a+2没有内存的位置标识。

我们平时经常写的这种语句:

A tmp;
A& ref=tmp;

ref其实是一个左值引用,tmp是一个左值,这段程序把左值引用ref和tmp绑定在一起。由于ref是左值引用,所以说:

A& ref=A()//错误,A()是右值
A&& ref=A()//正确,ref是右值引用

一般右值引用就是用一个临时对象进行操作,例如STL的map中:

mapped_type& operator[] (key_type&& k)

//那么我们我们可以这样用:
mymap[A()];
//找到mymap中临时对象对应的value,接着临时对象就销毁了

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值