使用 invoke_result 的正确方法?

Correct way of using invoke_result?

cppreference上写到std::result_of的正确使用方法是:

template<class F, class... Args>
std::result_of_t<F&&(Args&&...)> 
// instead of std::result_of_t<F(Args...)>, which is wrong
  my_invoke(F&& f, Args&&... args) { 
    /* implementation */
}

我想知道 std::invoke_result_t 应该如何使用: invoke_result_t:

template<class F, class... Args> 
std::invoke_result_t<F&&, Args&&...> my_invoke(F&& f, Args&&... args);

或者:

template<class F, class... Args> 
std::invoke_result_t<F, Args...> my_invoke(F&& f, Args&&... args);

invoke_result 根据 declval:

定义

If the expression INVOKE(declval<Fn>(), declval<ArgTypes>()...) is well-formed when treated as an unevaluated operand, the member typedef type names the type decltype(INVOKE(declval<Fn>(), declval<ArgTypes>()...)); otherwise, there shall be no member type.

declval指定为:

template<class T> add_rvalue_reference_t<T> declval() noexcept;

所以std::invoke_result_t<F&&, Args&&...>std::invoke_result_t<F, Args...>没有区别。好吧,后者短了 4 个字符,但它们的意思完全相同(因为 FArgs... 都不可能是 void)。