Рассмотрим эту цитату из С++ Templates: The Complete Guide (2nd Edition):
decltype(auto) ret{std::invoke(std::forward<Callable>(op), std::forward<Args>(args)...)}; ... return ret;
Обратите внимание, что объявление
ret
с помощьюauto&&
неверно. Как reference,auto&&
продлевает срок службы возвращаемого значения до тех пор, пока конец его области , но не выше инструкцииreturn
для вызывающей функции.
Автор говорит, что auto&&
не подходит для идеальной пересылки возвращаемого значения. Однако, не decltype(auto)
также формирует ссылку на значение xvalue/lvalue?
IMO, decltype(auto)
, то страдает от одной и той же проблемы. Тогда, какова точка автора?
EDIT:
Вышеприведенный фрагмент кода должен войти внутрь этого шаблона функции.
template<typename Callable, typename... Args>
decltype(auto) call(Callable&& op, Args&&... args) {
// here
}