Как на самом деле функция возвращает значение?

Если у меня есть класс 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);, он выводит:

копия-конструктор, конструктор, f, деструктор, что нормально, если предположить, что объект y в f() создается непосредственно в месте назначения, т.е. в ячейке памяти объекта b и без участия временных объектов.

Когда я выполняю строку A c = g(a);, она выводит:

конструктор-копия, конструктор, g, конструктор-копия, деструктор, деструктор,.

Итак, вопрос в том, почему в случае g() объект не может быть создан непосредственно в ячейке памяти c, как это произошло при вызове f()? Почему он вызывает дополнительный конструктор копирования (который, я полагаю, из-за участия временного) во втором случае?

5
задан cirronimbo 6 June 2012 в 12:54
поделиться