wrap function in std::forward for decltype, in order to preserve behavior of f::operator() (fix from Matt Renaud)