Временные объекты
Временный объект — это неименованный объект, созданный компилятором для хранения временного значения.
Замечания
В некоторых случаях компилятору необходимо создать временные объекты. Такие объекты могут создаваться по следующим причинам.
Чтобы инициализировать ссылку
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
иdo
switch
операторов.
См. также
Блог Херб Саттер на ссылки, просто
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по