总结:
最后发现,最朴素的写法反而是执行效率最高的写法(“第一个函数”),这种写法充分的利用了编译器在构造对象时进行的优化以及move赋值运算带来的优势,避免了对象在传递过程中产生的临时对象以及引发的构造和析构; 这也体现了move赋值运算存在的必要性。无论如何,都不能在函数内部返回临时变量的指针或引用,无论该引用是左值引用还是右值引用。C++11也从来没有认为变量的控制权被转移后析构就不再发生了。所以要在函数内部产生一个对象并返回,正确的做法是:1)将对象建立在堆内存上并返回地址;2)返回局部对象,并通过copy复制运算符在函数外复制该局部对象的副本;3)返回局部对象(是一个右值),并通过move复制运算符将返回的局部对象转移到另一个对象中;
上面这些结论在C++文档里说的很明白,但以前也从没有专门思考过,这次做一个测试,发现了一些没有发现的问题,特别是move赋值运算在传递返回值时的作用和move函数在返回时的无效性。所以有些东西光看文档是不够的,还得亲手试一下。