c++ 右值引用

今天查阅题目的时候看到这样一篇介绍String的文章 C++面试中string类的一种正确写法

看一会发现不只是很明白&&符号该作何处理,甚是郁闷,于是就google了下c++右值引用,看

了大概一下午,逐渐有了点自己的理。下面贴出自己的理解过程。


1、有了构造函数那转移构造函数是在什么时候用的(大神们原谅我比较菜)?

转移构造函数主要用在——右值作为参数时的情形。

当时并未想到这种情况,所以一直不理解知道我自己动手写了下:

int a = 0;
int &&c = a;	// Error : rvalue reference cannot be bound to a lvalue

编译器报错右值引用无法绑定到左值(关于左值和右值请移步 lvalue and rvalue)!

原来如此,在普通构造函数中传入临时变量时(右值)时,在传递过程中,系统会

为临时变量申请和释放空间,造成浪费。

所以使用转移构造函数避免这种情况发生。


2、完美转发又是什么?

起初我以为对于模板方法,因为const T&和T&的关系需要重载两次,是因为如果不重载两次,编译

会无法通过。

直到:

template <typename T> void print(const T &a)
{
	printf("%d", a);
}

int a = 0;
const int &b = 1;
get(a); // const int&
get(b); //const int&
get(0); //const int&
编译器不会任何错误,只是所有的参数都是以const int&方式传递,是不是这样传递方式会造成

什么方面的问题,所以才需要重载?请知道的大神告知下。。。

如果这里使用

template <typename T> void get(T &&a)
{
	printf("%d", a);
}
则所以参数都按照它原来的类型进行传递,这可能就是所谓的完美转发吧。

问题2主要参考 C++11 标准新特性: 右值引用与转移语义


好了,先告一段落,以后有机会使用的时候再深入研究

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值