Для начала, даже наивный компилятор не назначит & ldquo;
tlo & rdquo ;, поскольку стандарт не позволяет этого. Формальная семантика
вашего кода включает две копии (обе используют конструктор копирования);
первый от glo
до временного возвращаемого значения, а второй от этого
временное возвращаемое значение до tlo
. Стандарт, однако, формально дает
составители право исключить обе эти копии, в этом конкретном
случай, и практически говоря, я представляю, что все компиляторы делают.
Первая копия может быть подавлена в любое время, когда вы возвращаете локальную переменную или
временный; некоторые компиляторы этого не делают, если их больше одного
return
в коде, однако (но это никогда не будет иметь место в хорошо
письменный код).
Подавление второй копии зависит от того, что вы
Построение нового объекта на сайте вызова. Если вы не строите
новый объект, тогда может даже не быть второй копии для подавления; например
в случае как getLargeObject().memberFunction()
. Если вы назначаете
к существующему объекту, однако, компилятор мало что может сделать; Это
должен вызвать оператор присваивания. Если оператор присваивания копирует,
тогда вы получите эту копию.