Зачем нужна конструкция 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.