std :: tie上的std :: invoke_result

时间:2019-03-04 19:09:03

标签: c++ c++17

我在C ++ 17上使用GCC 7.3,但我不明白为什么此行失败:

template <typename... Args>
using X = std::invoke_result<std::tie, Args...>::type;

错误是:

error: type/value mismatch at argument 1 in template 
parameter list for ‘template<class _Functor, class ... _ArgTypes> 
struct std::invoke_result’
using X = std::invoke_result<std::tie, Args...>::type;
note:   expected a type, got ‘std::tie’

1 个答案:

答案 0 :(得分:5)

全部在错误消息中:

  

注意:需要一个类型,得到了“ std :: tie”

invoke_result是一个带有一堆 types 的元函数。 std::tie()功能模板-它不是类型。而且它甚至都不是对象,因此也无法执行invoke_result<decltype(std::tie), Args...>

invoke_result给您的是一种适用于所有可调用对象的语法。但是您不需要使用std::tie-它是一个函数模板,因此您可以在未评估的上下文中直接调用它:

template <typename... Args>
using X = decltype(std::tie(std::declval<Args>()...));

注意:除非您真的特别需要元函数本身,否则始终使用_t别名。也就是说,std::invoke_result_t<...>而不是std::invoke_result<...>::type。无论如何,后者是错误的,因为您缺少了typename关键字-并且别名消除了这种需要。