use 'decltype(auto)' instead of just 'auto' for function return types
to get more complete type information.