我在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’
答案 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
关键字-并且别名消除了这种需要。