Mediumlifetime

Чем return-by-reference опасен?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

Возврат по ссылке T& f() требует, чтобы объект жил дольше, чем ссылка. Классические баги: возврат ссылки на локальную переменную (dangling), на элемент контейнера, который может реалоцироваться.

// ПЛОХО: возврат ссылки на локальную — dangling
std::string& bad() {
    std::string local = "hi";
    return local;   // UB: local умрёт при выходе
}

// ОПРАВДАНО: accessor к long-lived полю
class Vec {
    std::vector<int> data_;
public:
    int& operator[](size_t i) { return data_[i]; }
};
  • return by value — выбор по умолчанию (RVO, move);
  • Return by reference оправдан: accessor к long-lived полю, chaining (stream << x << y), singleton’ы;
  • Возврат const& к temporary — UB (lifetime продлевается только в узких случаях).

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.