Почему я не вижу, что конструктор копирования вызывается в случае возврата объекта из функции в c++? [дубликат]


На этот вопрос уже есть ответ здесь:

В следующем коде переменная ret является переменной стека, и как только foo возвращает память, выделенную для ret, больше не существует. Но string-это класс, и конструктор копирования вызывается для копирования содержимого ret в var. Я хотел проверить валидность этого с помощью тестового кода:

class A
{
public:
    A(){ test(); }
    A(const A &){ std::cout << "copy constructor A" <<std::endl; }
    virtual void test(){ std::cout<< "A" <<std::endl;}
    A & operator=(const A &); 
};

A & A::operator=(const A &)
{
    std::cout << "assignment operator A" << std::endl; 
}

A functionA(int a)
{
    A localA;
    return localA;
}

int main()
{
     A a = functionA(2);    
}

Я ожидал, что результат будет таким:

  A 
  copy constructor A

Однако следующий код выводит следующее:

  A
Может ли кто-нибудь сказать мне, почему это происходит? Спасибо!
1   2  

1 ответ:

См. http://en.wikipedia.org/wiki/Copy_elision и http://en.wikipedia.org/wiki/Return_value_optimization .

В предложении компилятор видит, что вы просто копируете значение localA в amain), и вместо выполнения операции копирования он выполняет оптимизацию, где он просто непосредственно пишет в a в функции functionA.