I rarely see decltype(auto) but when I do it confuses me because it seems to do the same thing as auto when returning from a function.
auto returns what value-type would be deduced of you assigned the return clause to an auto variable. decltype(auto) returns what type you would get if you wrapped the return clause in decltype.
auto returns by value, decltype maybe not.
auto follows the template argument deduction rules and is always an object type; decltype(auto) follows the decltype rules for deducing reference types based on value categories. So if we have
int x;
int && f();
then
expression auto decltype(auto)
----------------------------------------
10 int int
x int int
(x) int int &
f() int int &&