std::indirect_result_t(3)

NAME
std::indirect_result_t - std::indirect_result_t

Synopsis
   Defined in header <iterator>
   template< class F, class... Is >
       requires (std::indirectly_readable<Is> && ...) &&
                 std::invocable<F, std::iter_reference_t<Is>...> (since C++20)
   using indirect_result_t = std::invoke_result_t<F,
   std::iter_reference_t<Is>...>;
   The alias template indirect_result_t obtains the result type of invoking an
   invocable type F on the result of dereferencing indirectly_readable types Is....

Template parameters
   F - an invocable type
   Is - indirectly readable types that are dereferenced to arguments

Example
// Run this code
 #include <iterator>
 #include <type_traits>
 struct Fn
 {
     long operator()(const int&);
     int operator()(int&&);
     short operator()(int, int) const;
     auto operator()(const float) -> int&;
     void operator()(int[8]);
 };
 static_assert(
     std::is_same_v<std::indirect_result_t<Fn, const int*>, long> and
     std::is_same_v<std::indirect_result_t<Fn, std::move_iterator<int*>>, int> and
     std::is_same_v<std::indirect_result_t<const Fn, int*, int*>, short> and
     std::is_same_v<std::indirect_result_t<Fn, float*>, int&> and
     std::is_same_v<std::indirect_result_t<Fn, int**>, void>
 );
 int main() {}

See also
   result_of deduces the result type of invoking a callable object with
   invoke_result a set of arguments
   (C++11)(removed in C++20) (class template)
   (C++17)