#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”,为什么?
答案 0 :(得分:1)
该问题称为 copy elision :在某些情况下,允许编译器忽略复制(或移动)对象的构造。值得注意的是,每当复制临时对象(即,没有名称的对象)时,可以省略该副本。从函数返回命名值时,也允许编译器删除副本。这通常被称为[命名]返回值优化或NRVO。
可以省略副本的情况(在C ++标准中,您可以在第12.8节[class.copy]第31段中找到详细信息):
即使应用此优化更改了程序的行为,即复制(或移动)构造函数或析构函数具有副作用,也特别允许复制省略。