复制构造函数没有被调用,而它应该被调用

Copy constructor is not called whereas it should be

#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)构造一个临时对象,然后使用 基础(基础常量 &b), 所以它会计算出“0"and "1”,但实际上它只计算出“0”,为什么?

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

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

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

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