我有一个“构建”要返回的结构的函数:
struct stuff {
int a;
double b;
Foo c;
};
stuff generate_stuff() {
Foo c = generate_foo();
//do stuff to Foo, that changes Foo:
//...
return {1, 2.0, c}; //should this be return {1, 2.0, move(c)};?
}
我应该c
离开这个功能吗?我意识到,(N)RVO 经常可以就地构建对象,但有时可能并非如此。什么时候不能完成 (N)RVO,因此,我应该什么时候移动函数的对象?
换句话说,这显然是返回的临时的 RVO。问题变成了,NRVO(命名返回值优化)会发生c
吗?将c
在原地构造(在函数的调用点,在临时stuff
结构内部),或者将c
在函数中构造,然后复制到调用点的结构中。