Ответ 1
decltype(auto)
генерирует другой тип, когда итератор ввода возвращается по значению. auto&&
создает ссылку rvalue на временную, а decltype(auto)
создает локальную копию (в С++ 17 она просто называет временную из-за гарантированного изменения разрешения).
Это мало чем отличается. В С++ 11/14 для него требуется переход ctor (который не вызывается на практике, но требуется) в случае decltype(auto)
, но не в С++ 17. В auto&&
перемещение ctor не вызывается и не требуется.
Другим отличием является тип decltype(item)
, который всегда ссылается на auto&&
, но в случае временного возвращаемого ввода iteraror decltype(item)
является типом значения.
Вот об этом. На практике я не вижу причин для decltype(auto)
над auto&&
.
В стороне, auto&
заставляет non-rvalue, const auto&
заставляет non-mutable, а auto
заставляет копию. Есть причины использовать auto&&
вместо них, но это выходит за рамки этого вопроса. decltype(auto)
ближе всего к auto&&
, поэтому я сравнил эти два.