Выбор ответа Middle Указатели и ссылки спрашивают часто обновлено
Ссылка на локальную переменную
Вопрос
Что не так с функцией const std::string& greet() { std::string s = "hi"; return s; }?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Возвращает висячую ссылку: s уничтожается при выходе из функции greet. Локальный объект умирает при выходе из функции, а ссылка на него остаётся.
Варианты ответа
- Ничего:
const&продлевает жизньsдо конца использования результата - Не скомпилируется: нельзя вернуть ссылку на локальную переменную
- Лишнее копирование строки при возврате, но поведение корректно
- Возвращает висячую ссылку:
sуничтожается при выходе из функцииgreetправильный ответ
Разбор
Локальный объект умирает при выходе из функции, а ссылка на него остаётся. Чтение через неё UB. GCC предупреждает -Wreturn-local-addr. Нужно возвращать std::string по значению: благодаря copy elision и move это дёшево.
- Продление жизни работает только для временного объекта, привязанного к ссылке напрямую, а не для локальной переменной, возвращаемой по ссылке.
- Код компилируется, максимум с предупреждением.
- Копирования здесь нет, проблема в висячей ссылке.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.