Почти всегда decltype (авто)?

decltype(auto) может выводить значение и ссылка. auto никогда не выводит ссылку. Мне кажется, что общий код и оптимизация decltype(auto) всегда должны быть предпочтительными. Это так? Рассмотрим, например, возврат объекта, который может или не может быть скопирован. auto& требуется, чтобы избежать его копирования, но это заставляет его всегда ссылаться. decltype(auto) - правильный вариант в этом случае. Каковы недостатки decltype(auto) помимо более типизации?

Ответ 1

Из часто задаваемых вопросов isocpp С++ 14 на decltype(auto):

Примечание. decltype (auto) в первую очередь полезен для вывода возвращаемого типа функций пересылки и аналогичных оболочек, как показано выше, где вы хотите, чтобы тип точно "отслеживал" какое-то выражение, вызываемое вами. Однако decltype (auto) не является широко используемой функцией, кроме этого. В частности, хотя он может быть использован для объявления локальных переменных, это, вероятно, просто антипаттерн, поскольку ссылка на локальные переменные не должна зависеть от выражения инициализации. Кроме того, он чувствителен к тому, как вы пишете оператор return. Эти две функции имеют разные типы возврата. look_up_a_string_1 возвращает a string, а look_up_a_string_2 возвращает a string&.

decltype(auto) look_up_a_string_1() { auto str = lookup1(); return str; }
decltype(auto) look_up_a_string_2() { auto str = lookup1(); return(str); }