返回值和右值引用的传递问题(二)

2014-11-24 03:26:41 · 作者: · 浏览: 1
变量的引用(不管是左值还是右值)都不会有正确结果。

总结:

  最后发现,最朴素的写法反而是执行效率最高的写法(“第一个函数”),这种写法充分的利用了编译器在构造对象时进行的优化以及move赋值运算带来的优势,避免了对象在传递过程中产生的临时对象以及引发的构造和析构; 这也体现了move赋值运算存在的必要性
   无论如何,都不能在函数内部返回临时变量的指针或引用,无论该引用是左值引用还是右值引用。C++11也从来没有认为变量的控制权被转移后析构就不再发生了。所以要在函数内部产生一个对象并返回,正确的做法是:1)将对象建立在堆内存上并返回地址;2)返回局部对象,并通过copy复制运算符在函数外复制该局部对象的副本;3)返回局部对象(是一个右值),并通过move复制运算符将返回的局部对象转移到另一个对象中;
   move函数不能乱用C++在一些场合下,隐含着右值的概念(比如函数返回值就是右值),此时将值进行类型转换都会导致额外的不必要开销(例如将返回值必须是“右值”,如果将其转为“右值引用”,编译器仍要生成代码将其转回“右值”的对象,等于做了一堆无用功)。

  上面这些结论在C++文档里说的很明白,但以前也从没有专门思考过,这次做一个测试,发现了一些没有发现的问题,特别是move赋值运算在传递返回值时的作用和move函数在返回时的无效性。所以有些东西光看文档是不够的,还得亲手试一下。