Я был бы осторожен и избежал бы ссылки на временный (kudos to A.N. для ссылки https://herbsutter.com/2008/01/01/gotw-88-a-c....). Его можно было бы легко изменить позже до auto &v2 = foo();
, что является неопределенным поведением.
Скотт Мейерс и Херб Саттер рекомендуют возвращать объекты, созданные по стеку, по значению. Вы можете использовать Оптимизацию возвращаемого значения имен (NRVO), чтобы обеспечить оптимальную производительность, которая на самом деле будет быстрее, чем возврат к временной или семантике перемещения.
Я не говорю, чтобы никогда не продлевать время жизни на константных ссылках, я уверен, что могут быть случаи, когда это имеет смысл, например, когда NRVO не может быть сделано, все, что я говорю, - это избегать это, если нет веской причины. Это не очень хорошо известная функция, и это может привести к опасному коду.
ОБНОВЛЕНО: Исправлено, что const auto &v2 = foo();
действительно действительный код, но добавил объяснение, почему его все равно следует избегать. Также добавлена ссылка, описывающая NRVO.
«Преждевременная оптимизация - корень всех злых» – Slava
@ СЛАВА весь этот язык - это все о микро оптимизации. – grisevg
@grisevg Я не согласен. Прежде всего, совершенно неважно, насколько быстро работает некорректная программа. Поэтому сначала читаемость, затем микропомимизация и только там, где это необходимо. – Slava