Если у меня есть класс A (который возвращает объект по значению) и две функции f() и g(), имеющие разницу только в своих возвращаемых переменных:
class A
{
public:
A () { cout<<"constructor, "; }
A (const A& ) { cout<<"copy-constructor, "; }
A& operator = (const A& ) { cout<<"assignment, "; }
~A () { cout<<"destructor, "; }
};
const A f(A x)
{A y; cout<<"f, "; return y;}
const A g(A x)
{A y; cout<<"g, "; return x;}
main()
{
A a;
A b = f(a);
A c = g(a);
}
Теперь, когда я выполняю строку A b = f(a);
, она выводит:
copy-constructor, constructor, f, destructor
, что хорошо, если предположить, что объект y в f() создается непосредственно в месте назначения, т. е. в ячейке памяти объекта b, без участия временных объектов.
А когда я выполняю строку A c = g(a);
, она выводит:
copy-constructor, constructor, g, copy-constructor, destructor, destructor,
.
Итак, вопрос в том, почему в случае g() объект не может быть создан непосредственно в ячейке памяти c, как это произошло при вызове f()? Почему он вызывает дополнительный конструктор-копию (который, я полагаю, из-за участия временного) во втором случае?