Тимчасові об'єкти — у програмуванні об'єкти, які компілятор створює автоматично під час обчислення виразів . Такі об'єкти не мають імені та знищуються відразу ж, як тільки в них зникає потреба.
Компілятор мови C++ викликає для тимчасових об'єктів конструктори (за потребою) і деструктори (відразу після виконання виразу). Це, наприклад, важливо для об'єкта string_view
C++17.
При ініціалізації масивів у C++ тимчасовий об'єкт зникає перед ініціалізацією наступного елемента.
string r = string("1") + "2" + "3";
Цей код працює таким чином ( ctor
- конструктор, dtor
- деструктор ).
string r, tmp1, tmp2, tmp3;
tmp1.ctor("1");
tmp2.ctor();
tmp2 = tmp1 + "2";
tmp3.ctor();
tmp3 = tmp2 + "3";
r.ctor(tmp3);
tmp3.dtor();
tmp2.dtor();
tmp1.dtor();
std::wstring expandFileName(const std::wstring& x); // отримує повний шлях. Потребує нуль-термінованості - тому на вході wstring
std::wstring_view extractFilePath(std::wstring_view x); // витягує з шляху корінь + каталоги + роздільник
std::wstring tempFileName()
{
return std::wstring(extractFilePath(expandFileName(someFile)))
.append(L"~filename.tmp");
}
C++ гарантує, що тимчасовий рядок expandFileName(someFile)
буде знищений пізніше, ніж wstring_view
, які на ньому «паразитують», «матеріалізуються» в інший, так само тимчасовий рядок std::wstring(...)
.
Практично всі мови (крім найнижчих) здатні автоматично створювати тимчасові змінні для проміжних результатів простих типів (цілий, дійсний, вказівник). У багатьох мовах (наприклад у Паскалі) існує подібна система для рядків. Практично всі мови програмування зі збором сміття (C#, Java) видають проміжні результати будь-якого типу — адже для них немає різниці між постійним та тимчасовим об'єктом. Тільки C++ здатний автоматично створювати проміжні об'єкти довільних типів, викликаючи їм конструктор і деструктор.