продление времени жизни для функции, принимающей параметр по const & и возвращающей по const & - PullRequest
5 голосов
/ 16 мая 2019

В C ++, когда у вас есть следующее:

std::string get_string();
std::string const& v = get_string();

Срок действия временного значения, возвращаемого из get_string (), продлевается на то же время существования ссылки v;

Если у меня естьследующее:

std::string const& get_string(std::string const& p) {
  return p;
}

std::string const& v = 
get_string(std::string{"Hello"});

Продлен ли срок действия временного?или это висячая ссылка;

Насколько я понимаю, временная привязка связана с временем жизни p и существует только на время действия функции, а вторичные ссылки на временную переменную не увеличивают время жизни.

Каков ожидаемый результат?

1 Ответ

1 голос
/ 16 мая 2019

Да, срок службы временного не продлевается больше;после полного выражения ссылка v становится висячей.

std::string const& v = get_string(std::string{"Hello"});
// v becomes dangled now

Насколько я понимаю, временное значение связано с временем жизни p и существует только на время действия функции

Если быть точным, временный существует до конца полного выражения, а не только для продолжительности функции.

  • временная границапараметр ссылки в вызове функции существует до конца полного выражения, содержащего этот вызов функции: если функция возвращает ссылку, которая переживает полное выражение, она становится висячей ссылкой.

InВ общем, время жизни временного объекта не может быть дополнительно увеличено путем «передачи его»: вторая ссылка, инициализированная из ссылки, к которой привязан временный объект, не влияет на его время жизни.

Это означает, чточто-то вроде auto sz = get_string(std::string{"Hello"}).size(); нормально.

...