Временные объекты

Временный объект — это неименованный объект, созданный компилятором для хранения временного значения.

Замечания

В некоторых случаях компилятору необходимо создать временные объекты. Такие объекты могут создаваться по следующим причинам.

  • Чтобы инициализировать ссылку const с инициализатором типа, отличного от базового типа инициализированной ссылки.

  • Для хранения возвращаемого значения функции, возвращающей определяемый пользователем тип (UDT). Эти временные объекты создаются только в том случае, если программа не копирует возвращаемое значение в объект. Например:

    UDT Func1();    //  Declare a function that returns a user-defined
                    //   type.
    
    ...
    
    Func1();        //  Call Func1, but discard return value.
                    //  A temporary object is created to store the return
                    //   value.
    

    Так как возвращаемое значение не копируется в другой объект, создается временный объект. Более распространенный случай создания временных объектов — во время вычисления выражения, где требуется вызов перегруженных функций оператора. Эти перегруженные функции оператора возвращают определяемый пользователем тип, который часто не копируется в другой объект.

    Рассмотрим выражение ComplexResult = Complex1 + Complex2 + Complex3. Сначала вычисляется выражение Complex1 + Complex2, и результат сохраняется во временном объекте. Затем вычисляется временное+ Complex3 выражение, и результат копируется ComplexResult в (если оператор назначения не перегружен).

  • Для сохранения результата приведения к пользовательскому типу. Когда объект заданного типа явно преобразуется в пользовательский тип, этот новый объект создается как временный.

Временные объекты имеют время существования, определенное их точкой создания и точкой их уничтожения. Любое выражение, создающее несколько временных объектов, в конечном итоге уничтожает их в обратном порядке создания.

При уничтожении временного объекта зависит от того, как он используется:

  • Временные элементы, используемые для инициализации const ссылок:
    Если инициализатор не является l-значением того же типа, что инициализирована ссылка, создается временный тип базового объекта. Он инициализирован выражением инициализации. Этот временный объект уничтожается сразу после уничтожения ссылочного объекта, к которому она привязана. Так как это разрушение может произойти хорошо после выражения, создавшего временное, иногда это называется расширением времени существования.

  • Временные элементы, созданные в качестве эффекта оценки выражений:
    Все временные элементы, которые не соответствуют первой категории, и которые создаются как эффект оценки выражений, уничтожаются в конце инструкции выражения (то есть в точке с запятой) или в конце контрольных выражений для for, if, whileи doswitch операторов.

См. также

Блог Херб Саттер на ссылки, просто