假设我有这段代码:
class Base {
public:
void f() {}
private:
int n;
};
Base foo()
{
Base b;
// processing
return b;
}
Base没有定义复制构造函数,并且查看其成员,编译器将不会合成一个 是否对此代码应用了命名返回值(NRV)优化?编译器应用NRV时的确切规则是什么?
答案 0 :(得分:1)
首先,没有确切的规则,因为NRVO不是标准的明确部分,而是标准的其他部分允许的。编译器永远不需要使用NRVO,并且不同的编译器将被禁止使用不同构造的NRVO。
在您的情况下,没有什么明显的禁止使用NRVO。没有显式的析构函数或复制构造函数,并且返回的变量在任何条件或循环块之外声明。这取决于// processing
区域内的情况。