【问题标题】:std::invoke_result on std::tiestd::tie 上的 std::invoke_result
【发布时间】:2019-03-04 19:09:03
【问题描述】:

我正在使用带有 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’

【问题讨论】:

    标签: c++ c++17


    【解决方案1】:

    都在错误信息中:

    注意:期望一个类型,得到'std::tie'

    invoke_result 是一个接受一堆类型的元函数。 std::tie() 是一个函数模板——它不是一个类型。而且它甚至不是一个对象,所以你也不能做invoke_result&lt;decltype(std::tie), Args...&gt;

    invoke_result 为您提供了一种适用于各种可调用对象的语法。但是std::tie 不需要它——它是一个函数模板,所以你可以直接在未评估的上下文中调用它:

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

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

    【讨论】:

      猜你喜欢
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 2015-09-25
      • 1970-01-01
      • 2017-04-04
      • 2017-10-01
      相关资源
      最近更新 更多