F(Args...) 是以Args... 为实参类型而以 F 为返回类型的函数类型。因而,std::result_of 承受了许多怪异,导致它在 C++17 中被 std::invoke_result 取代而被弃用: F 不能是函数类型或数组类型(但可以是到它们的引用); 若Args 中的任何类型是“T 的数组”类型或函数类型 T,则它被自动调整为 T*; ...
而std::invoke_result的使用方式是std::invoke_result_t,其中F是函数类型,Args...是参数类型列表。 尽管std::result_of在C++17中被弃用,但在旧的代码中仍然可以看到它的身影。因此,理解std::result_of和std::invoke_result的区别和联系对于阅读和理解C++代码是非常重要的。 在英语口语交流中,我们通常会说 “In...
(1) (C++14 起) (C++17 中弃用) (C++20 中移除) template< class F, class... ArgTypes> using invoke_result_t = typename invoke_result<F, ArgTypes...>::type; (2) (C++17 起) 可能的实现 namespace detail { template <class T> struct is_reference_wrapper : std::false_type {};...
因而, std::result_of 承受了许多怪异,导致它在 C++17 中被 std::invoke_result 取代而被弃用: F 不能是函数类型或数组类型(但能是到它们的引用); 若任何 Args 拥有“ T 的数组”类型或函数类型 T ,则它被自动调整为 T*; F 或任何 Args... 都不能是抽象类类型; 若任何 Args... 拥有顶层 ...
因而, std::result_of 承受了许多怪异,导致它在 C++17 中被 std::invoke_result 取代而被弃用: F 不能是函数类型或数组类型(但能是到它们的引用); 若任何 Args 拥有“ T 的数组”类型或函数类型 T ,则它被自动调整为 T*; F 或任何 Args... 都不能是抽象类类型; 若任何 Args... 拥有顶层 ...