Почему я не вижу, что конструктор копирования вызывается в случае возврата объекта из функции в 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 ответ:
См. http://en.wikipedia.org/wiki/Copy_elision и http://en.wikipedia.org/wiki/Return_value_optimization .
В предложении компилятор видит, что вы просто копируете значение
localA
вa
(вmain
), и вместо выполнения операции копирования он выполняет оптимизацию, где он просто непосредственно пишет вa
в функцииfunctionA
.