0

可以说我有这段代码:

class Base {
public:
    void f() {}
private:
    int n;
};

Base foo()
{
    Base b;

    // processing

    return b;
}

Base 没有定义复制构造函数,并且查看其成员,编译器不会合成一个。
是否为此代码应用了命名返回值 (NRV) 优化?编译器应用 NRV 的确切规则是什么?

4

1 回答 1

1

首先,没有确切的规则,因为 NRVO 不是标准的明确部分,而是标准的其他部分允许的。编译器永远不需要使用 NRVO,并且不同的编译器将被不同的构造禁止使用 NRVO。

在您的情况下,没有明显的限制使用 NRVO。没有显式析构函数或复制构造函数,并且返回的变量在任何条件或循环块之外声明。不过,这取决于该// processing地区的情况。

于 2014-02-17T09:14:03.850 回答