复制构造函数不会被调用,而应该是

时间:2015-12-03 09:50:20

标签: c++ copy-constructor

#include <iostream>
using namespace std;
class Base{
    int a;
public:
    Base(int b):a(b){cout<<"0"<<endl;}
    Base(Base const &b):a(b.a){cout<<"1"<<endl;}
private:
    Base(Base &b);
};
Base fun(){
    return 2;//
}
int main(){
    fun();
    return 0;
}

我认为它将调用Base(int b)来构造一个临时对象,然后使用  基地(基地const&amp; b), 所以它会输出“0”和“1”,但作为fack的问题,它只会“0”,为什么?

1 个答案:

答案 0 :(得分:1)

该问题称为 copy elision :在某些情况下,允许编译器忽略复制(或移动)对象的构造。值得注意的是,每当复制临时对象(即,没有名称的对象)时,可以省略该副本。从函数返回命名值时,也允许编译器删除副本。这通常被称为[命名]返回值优化或NRVO。

可以省略副本的情况(在C ++标准中,您可以在第12.8节[class.copy]第31段中找到详细信息):

  • 复制临时变量时
  • 使用其名称
  • 返回局部变量(但不是函数参数)时
  • 使用其名称
  • 抛出局部变量(但不是函数参数)时
  • 按值捕获异常时

即使应用此优化更改了程序的行为,即复制(或移动)构造函数或析构函数具有副作用,也特别允许复制省略。