Сохраняется ли эта временная ссылка достаточно долго? - PullRequest
16 голосов
/ 06 февраля 2012

В

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

int x = foo(5);

Имеет ли ссылка временное "выживание", пока оно не будет присвоено х?

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

В рассматриваемом коде есть несколько законных оснований полагаться на константные ссылки, то есть мне понадобятся две отдельные функции

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

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

1 Ответ

14 голосов
/ 06 февраля 2012

Имеет ли ссылка на временное "выживание", пока оно не присвоено х?

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

C ++ 03, 12.2 / 3:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...