Рассмотрим эту цитату из С++ 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
}