9

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

1 回答 1

8

invoke_result定义为declval

如果表达式INVOKE(declval<Fn>(), declval<ArgTypes>()...)在被视为未计算的操作数时格式正确,则成员 typedeftype命名该类型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)。

于 2017-12-18T19:50:28.140 回答