Временный объект (temporary) - это объект, созданный в результате:
Ссылка на временный объект - это привязка ссылки к такому временному значению.
const std::string& badRef = std::string("temporary");
// Временный объект уничтожается, ссылка становится висячей
Стандарт C++ определяет особые случаи, когда время жизни временного объекта продлевается:
const std::string& validRef = std::string("Hello");
// Время жизни продлено до времени жизни ссылки
std::string&& rvalueRef = std::string("Modern");
// Также продлевает время жизни
const std::string& getString() {
return std::string("Safe"); // Время жизни НЕ продлевается - опасность!
}
auto str = std::string("temporary"); // Копирование
const auto& strRef = str; // Ссылка на существующий объект
std::string createString() {
return std::string("Movable");
}
std::string permanent = std::move(createString()); // Перемещение
template<typename T>
void forwarder(T&& arg) {
// arg сохраняет временный объект
}
forwarder(std::string("Forwarded"));
Не работает с не-const ссылками:
std::string& invalid = std::string("temp"); // Ошибка компиляции
Не распространяется через возврат из функций:
const std::string& danglingRef = getString(); // Висячая ссылка!
Не применимо к членам класса:
struct Holder {
const std::string& ref;
Holder(const std::string& r) : ref(r) {}
};
Holder h(std::string("temporary")); // ref станет висячей
const auto& matrix = getTransformationMatrix(); // Время жизни продлено
renderScene(matrix);
const auto& element = getCollection().front(); // Временная коллекция удаляется
use(element); // Неопределенное поведение
Время жизни временных объектов автоматически продлевается только при:
Явные способы продления:
Главные опасности:
Правильное обращение с временными объектами критически важно для написания безопасного и эффективного кода на C++.