使用invoke_result的正确方法?

时间:2017-12-18 19:43:47

标签: c++ c++17 forwarding-reference result-of

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_tinvoke_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);

1 个答案:

答案 0 :(得分:4)

invoke_result是根据declval

定义的
  

如果表达式INVOKE(declval<Fn>(), declval<ArgTypes>()...)在被视为未评估的操作数时格式正确,则成员typedef type将类型命名为decltype(INVOKE(declval<Fn>(), declval<ArgTypes>()...));,否则将不存在成员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)。