R.12.2 Временные объекты

R.12.2 Временные объекты

В некоторых ситуациях транслятору бывает необходимо или удобно создавать временные объекты. Использование временных объектов зависит от реализации. Если транслятору понадобился временный объект типа класса с конструктором, он должен обеспечить вызов конструктора для этого временного объекта. Аналогично, необходимо вызывать деструктор для объекта класса, в котором описан деструктор. Приведем пример:

class X {

 //…

public:

 //…

 X(int);

 X(X&);

 ~X();

};

X f(X);

void g()

{

 X a(1);

 X b = f(X(2));

 a = f(b);

}

Здесь нужен временный объект для построения X(2), прежде чем передать его функции f() с помощью X(X&). Альтернативное решение, - построить объект X(2) в памяти, используемой для хранения параметра при первом вызове f(). Помимо этого, временный объект может понадобиться для хранения результата f(X(2)) прежде, чем копировать его в объект b с помощью X(X&), и здесь возможно альтернативное решение: хранить результат f(X(2)) в памяти для объекта b. С другой стороны, существует много функций f(), для которых выполнение выражения a=f(a) требует временного объекта или для параметра a, или для результата f(a), чтобы избежать нежелательного использования памяти, которой приписывается имя a.

Транслятор обязан гарантировать уничтожение временных объектов. Точный момент уничтожения определяется реализацией. С временными объектами можно производить только две операции: выбрать значение объекта (неявно копируя его) для использования в другом выражении, или взять ссылку на него. Если значение временного объекта получено, он считается ненужным и может уничтожаться немедленно. Если на него получена ссылка, то уничтожать его нельзя, пока существует ссылка. Уничтожение должно произойти до выхода из области определенности, в которой был создан временный объект.

Другой вид временных объектов обсуждается в §R.8.4.3.