今天查阅题目的时候看到这样一篇介绍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 标准新特性: 右值引用与转移语义。
好了,先告一段落,以后有机会使用的时候再深入研究