我的理解是,要让编译器能够进行命名返回值优化 (NRVO),返回值必须在函数体中的任何其他值之前声明。我怀疑这可能是由于发生异常时堆栈展开的顺序,但我不确定。命名返回值必须是函数体中第一个声明的原因是什么?
class C{};
C f(){
C ret; //NRVO possible
return ret;
}
C g(){
int i;
C ret; //NRVO not possible?
return ret;
}
用例:
auto c = f();
auto c2 = g();
编辑: 感谢所有回答者帮助我理解这一点,我开始怀疑 Chandler Carruth 在此处的声明:http ://www.youtube.com/watch?v= fHNmRkzxHWs 分钟 32:30 可能具有误导性和/或我只是误解它。首先声明返回变量似乎并不重要。