Подтвердить что ты не робот

Зачем присваивать возвращаемое значение ссылке?

Я просматриваю некоторый код, и все вызовы функции, возвращающей строку, присваиваются ссылке. Функция prototype выглядит примерно так:

 std::string GetPath(const std::string& top);

и используется как

std::string& f = GetPath(cw);

или

 const std::string& f = GetPath(cw);

Зачем использовать ссылку здесь вместо

 std::string f = GetPath(cw);
4b9b3361

Ответ 1

Если, функция вернула ссылку (которой это не так), то вам может потребоваться присвоить возвращаемое значение ссылке, чтобы сохранить "актуальную" "с любыми изменениями в этом объекте. Возвращенная ссылка должна быть связана с объектом с продолжительностью жизни, который был расширен за пределами функции.

Или (если возвращаемая ссылка не была - const), потому что вы хотели сохранить ссылку на объект, чтобы изменить его как последующую точку. (Если вы хотите немедленно изменить его, вы сделаете это напрямую, нет необходимости хранить ссылку.)

Поскольку функция возвращает значение, которое вы могли бы присвоить ей ссылку const (ссылка на const была бы незаконной) и продлить время жизни объекта на время жизни ссылки. Однако эффект будет точно таким же (const в стороне) как сохранение значения в объекте напрямую.

Любая мысль о том, что она может быть менее эффективной, может оказаться необоснованной, и вы можете квалифицировать объект с помощью const, если хотите. (Большинство компиляторов исключают подразумеваемые временные и создают возвращаемое значение в инициализированном объекте.)

Когда тип объекта возвращается из функции по значению, он должен быть скопирован, поэтому это не является основанием для использования ссылки из-за опасения, что это не так.

Ответ 2

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

const std::string& func();
...
const std::string& tmp = func();
...

чтобы сохранить копию строки.

Ответ 3

Хорошо, это совершенно бессмысленно. И выглядит ужасно. И недействительный С++. Просто не делать это.

Изменить: для лучшего понимания того, что я имею в виду

reference & var = funcNotReturningReference(); //invalid C++
const reference & cvar = funcNotReturningReference(); //silly C++, no saving costs (reference to temporary stops temporary from being released, but this code does not help anything)