Сохраняет ли эта временная ссылка достаточно долго? - программирование
Подтвердить что ты не робот

Сохраняет ли эта временная ссылка достаточно долго?

В

template <typename T>
T const & foo(T const & dflt) 
  { return /* ... */ ? /* ... */ : dflt; }

int x = foo(5);

Указывает ли ссылка на временную "выживать" до тех пор, пока она не будет назначена на x?

(Я знаю, что он выживает при длительности вызова foo(), но задание заставляет меня колебаться)

Этот код имеет некоторые законные способы использования ссылок на ссылки здесь, то есть мне нужны две отдельные функции

T const & foo_cr(T  const & dflt);
T const & foo_v(T dflt);

который я хочу избежать (просто полагаться на разные подписи с одним и тем же именем кажется мне немного рискованным).

4b9b3361

Ответ 1

Указывает ли ссылка на временную "выживать" до тех пор, пока она не будет назначена на x?

Как правило, да. Если foo возвращает dflt, эта ссылка (для временного 5) действительна до конца полного выражения, в котором она была создана, то есть до момента инициализации.

С++ 03, 12.2/3:

Когда реализация вводит временный объект класса, который имеет нетривиальный конструктор (12.1), он должен гарантировать, что a конструктор вызывается для временного объекта. Аналогичным образом, деструктор должен быть вызван на временное с нетривиальным деструктор (12.4). Временные объекты уничтожаются как последний шаг в оценивая полное выражение (1.9), которое (лексически) содержит где они были созданы. Это справедливо, даже если эта оценка заканчивается бросанием исключения.

Больше приходит в 12.2/4 и 12.2/5, особенно исключения этого правила.

Я не вижу, что произойдет, когда он вернет ..., который вы оставили, но я думаю, вы не спрашивали об этом.