Конструкция decltype(auto)

1,00
р.
Зачем нужна конструкция decltype(auto) при возврате из функции, если можно писать auto?

Ответ
auto это "усохший" (decayed) тип выражения, т.е. теряются ссылки и происходит копирование:
string& f()
auto x = f() // тип x - string, ссылка потерялась, строка скопировалась
auto g() { return f() } // возвращается string // аналог в С++11: auto g() -> decay::type
decltype(expr) - это фактический тип выражения, без усыханий. decltype(auto) - это удобный синтаксис, который позволяет не писать выражение внутри decltype.
decltype(auto) y = f() // тип y - string& // аналог в С++11: decltype(f()) y = f()
decltype(auto) h() { return f() } // возвращается string& // аналог в С++11: auto h() -> decltype(f())
Другими словами, decltype(auto) это удобная замена decltype(expr), а auto это короткий синтаксис для std::decay::type.