Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当未为类定义复制构造函数时,是否会进行RVO优化?_C++_Rvo - Fatal编程技术网

C++ 当未为类定义复制构造函数时,是否会进行RVO优化?

C++ 当未为类定义复制构造函数时,是否会进行RVO优化?,c++,rvo,C++,Rvo,假设我有一段代码: class Base { public: void f() {} private: int n; }; Base foo() { Base b; // processing return b; } Base没有定义副本构造函数,并且在查看其成员时,编译器不会合成副本构造函数。 命名返回值(NRV)优化是否适用于此代码?编译器应用NRV的确切规则是什么 首先,没有确切的规则,因为NRVO不是标准的明确部分,而是标准的其他部分允许的

假设我有一段代码:

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

Base foo()
{
    Base b;

    // processing

    return b;
}
Base没有定义副本构造函数,并且在查看其成员时,编译器不会合成副本构造函数。

命名返回值(NRV)优化是否适用于此代码?编译器应用NRV的确切规则是什么

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


在你的情况下,没有什么明显的限制NRVO的使用。没有显式的析构函数或复制构造函数,返回的变量在任何条件或循环块之外声明。但是,这取决于
//处理区域中发生的事情。

为什么您认为编译器不会为该类合成复制构造函数?因为它只执行成员复制。如果我错了,请更正。执行成员级复制是编译器合成的复制构造函数所做的。由于我在Linux环境中的g++/clang++上的实验,如果类中没有复制构造函数,则不会实现NRVO。