Nei*_*l G 119 c++ rvalue-reference c++11
例如:
Beta_ab&&
Beta::toAB() const {
return move(Beta_ab(1, 1));
}
Run Code Online (Sandbox Code Playgroud)
Joh*_*itb 223
Beta_ab&&
Beta::toAB() const {
return move(Beta_ab(1, 1));
}
Run Code Online (Sandbox Code Playgroud)
这将返回一个悬空引用,就像左值引用案例一样.函数返回后,临时对象将被破坏.您应该Beta_ab按值返回,如下所示
Beta_ab
Beta::toAB() const {
return Beta_ab(1, 1);
}
Run Code Online (Sandbox Code Playgroud)
现在,它正确地将临时Beta_ab对象移动到函数的返回值中.如果编译器可以,它将通过使用RVO(返回值优化)完全避免移动.现在,您可以执行以下操作
Beta_ab ab = others.toAB();
Run Code Online (Sandbox Code Playgroud)
并且它将构建临时构造ab,或者做RVO以省略完全移动或复制.我建议你阅读BoostCon09 Rvalue References 101,它解释了这个问题,以及(N)RVO如何与之相互作用.
在其他情况下,返回右值参考的情况是个好主意.想象一下,你有一个getAB()经常在临时调用的函数.使它返回rvalue临时值的常量参考值并不是最佳的.你可以像这样实现它
struct Beta {
Beta_ab ab;
Beta_ab const& getAB() const& { return ab; }
Beta_ab && getAB() && { return move(ab); }
};
Run Code Online (Sandbox Code Playgroud)
请注意,move在这种情况下不是可选的,因为ab既不是本地自动也不是临时右值.现在,ref-qualifier &&说第二个函数是在rvalue temporaries上调用的,进行了以下移动,而不是复制
Beta_ab ab = Beta().getAB();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
57774 次 |
| 最近记录: |