复制构造函数省略?

Chu*_*dad 4 c++ copy-constructor copy-elision

可能重复:
为什么析构函数只被调用一次?

鉴于下面的代码,我无法理解gcc中的输出.我希望创建和销毁两个对象,但只能看到对构造函数和析构函数的一次调用.这里发生了什么事?

#include <string>
#include <iostream>

struct Huge{
        Huge() { std::cout << "Constructor" << std::endl; }
        Huge(Huge const &r) { std::cout << "Copy Constructor" << std::endl; }
        ~Huge() { std::cout << "Destructor" << std::endl; }
};

Huge g() {
        std::cout << "Entering g" << std::endl;
        Huge temp;
        std::cout << "Exiting g" << std::endl;
        return temp;
}

int main(){
        Huge h2(g());
        std::cout << "Before leaving main" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

g ++(4.4)中此代码的输出是

输入g

构造函数

退出g

在离开主要之前

析构函数

Alo*_*ave 6

是的,这是通过命名返回值优化的复制省略.

C++标准允许实现省略由return语句产生的复制操作,即使复制构造函数有副作用.

参考:

C++ 03标准:
12.8复制类对象:

#15

当满足某些条件时,允许实现省略类对象的复制结构,即使该对象的复制构造函数和/或析构函数具有副作用.在这种情况下,实现将省略的复制操作的源和目标视为仅仅两种不同的引用同一对象的方式,并且该对象的销毁发生在两个对象被销毁的时间的晚期.优化 .111)在以下情况下允许复制操作的省略(可以组合以消除多个副本):

- 在具有类返回类型的函数的return语句中,当表达式是具有与函数返回类型相同的cv-unqualified类型的非易失性自动对象的名称时,通过构造自动化可以省略复制操作对象直接进入函数的返回值

- 当一个未绑定到引用(12.2)的临时类对象被复制到具有相同cv-nonqualified类型的类对象时,可以通过将临时对象直接构造到省略的目标中来省略复制操作复制