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

Продление жизни временного объекта

Вопрос

Корректен ли код const std::string& s = std::string("a") + "b"; std::cout << s;?

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

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

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

Коротко

Правильный ответ: Да: временный объект, привязанный к const&, живёт вместе со ссылкой. Правило продления жизни: если временный объект напрямую привязан к ссылке на константу (или к rvalue-ссылке), он живёт столько же, сколько ссылка. - Висячая ссылка получилась бы, если бы временный объект прошёл через функцию, возвращающую…

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

  1. Нет: временный объект умирает в конце полного выражения, s висит
  2. Нет: к const& нельзя привязать временный объект, только к &&
  3. Да: временный объект, привязанный к const&, живёт вместе со ссылкойправильный ответ
  4. Да, но только при включённой оптимизации, которая убирает временный объект

Разбор

Правило продления жизни: если временный объект напрямую привязан к ссылке на константу (или к rvalue-ссылке), он живёт столько же, сколько ссылка.

  • Висячая ссылка получилась бы, если бы временный объект прошёл через функцию, возвращающую ссылку (например, std::max).
  • К const& временные объекты привязывать можно, к неконстантной lvalue-ссылке нельзя.
  • Оптимизации тут ни при чём: это правило языка.

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

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

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