右值引用在编码和性能上确实带来了不少的便利。
不过最近在函数返回临时对象的case下发现一些不同:
有一条原则是在NRVO时候,如果函数体内存在不同的分支返回不同的变量 如if x return a; else return b;
则RVO失效,试验了下有下面的结果(用常见的string实验):
1.在linux下RVO正常 (tlinux 2.2 )。
2.在windows(vs2015)下情况就有点特殊:只在第一个return使用了RVO,后面的return并没有
PS:本人以前研究底层的汇编的原因,所以比较喜欢看原理,从汇编角度看RVO的实现原理 其实是编译器偷偷的把外部返回值接收者的变量的地址做为一个隐藏参数传进了函数,这就为RVO提供了充分的可能条件。理解指针和内存的话,其实什么魔法都逃不了这2个概念。
以前的参数引用 也是如此(传了变量的指针,原理不变,只是编码上换了新样)
类函数访问类成员也是如此(对象作为ECX传进函数)