Выбор ответа Middle Указатели и ссылки спрашивают часто обновлено

Ссылка на локальную переменную

Вопрос

Что не так с функцией const std::string& greet() { std::string s = "hi"; return s; }?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Возвращает висячую ссылку: s уничтожается при выходе из функции greet. Локальный объект умирает при выходе из функции, а ссылка на него остаётся.

Варианты ответа

  1. Ничего: const& продлевает жизнь s до конца использования результата
  2. Не скомпилируется: нельзя вернуть ссылку на локальную переменную
  3. Лишнее копирование строки при возврате, но поведение корректно
  4. Возвращает висячую ссылку: s уничтожается при выходе из функции greetправильный ответ

Разбор

Локальный объект умирает при выходе из функции, а ссылка на него остаётся. Чтение через неё UB. GCC предупреждает -Wreturn-local-addr. Нужно возвращать std::string по значению: благодаря copy elision и move это дёшево.

  • Продление жизни работает только для временного объекта, привязанного к ссылке напрямую, а не для локальной переменной, возвращаемой по ссылке.
  • Код компилируется, максимум с предупреждением.
  • Копирования здесь нет, проблема в висячей ссылке.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме