【问题标题】:C++14 'auto' is able to get function return type, do we still need std::result_of<>?C++14 'auto' 能够获取函数返回类型,我们还需要 std::result_of<> 吗?
【发布时间】:2017-07-11 22:41:08
【问题描述】:

似乎C++14的auto关键字可以用来出现在函数定义的位置来表示返回类型。在这种情况下,还需要std::result_of 吗?现在是不是已经过时了?

【问题讨论】:

  • 使用std::result_of 代替auto 声明可能更方便,然后使用decltype。拥有更多可供选择的选择和选择总是一件好事。

标签: c++ types return c++14 auto


【解决方案1】:

是的,绝对的。

  1. 有时你想要返回类型,但不是函数的结果。假设我有一个vector&lt;X&gt;,我想对每个元素应用一个函数并返回结果。这个操作称为mapfmap,我们可以这样实现签名:

    template <class T, class F,
        class U = std::decay_t<std::result_of_t<F&(T const&)>>>
    std::vector<U> map(std::vector<T> const&, F );
    

    您可以将返回类型设为auto,但无论如何,您需要计算该类型U,而auto 不会将其提供给您。任何时候你想要一个不一定是返回类型的函数调用的结果,auto 不会削减它。

  2. SFINAE。考虑以下之间的区别:

    template <class F>
    decltype(auto) foo(F f) { return f(0); }
    template <class F>
    std::result_of_t<F&(int)> bar(F f) { return f(0); }
    

    如果F 不能用int 调用,则实例化foo() 是一个硬编译错误,但bar() 将简单地从重载集中删除。这在通用代码中非常有价值,因为您可以测试表达式的格式是否正确。

  3. 注释。 auto 没有告诉你函数返回类型。如果函数返回调用带有某些参数的可调用对象的结果,std::result_of_t&lt;F(A, B)&gt; 本身会告诉我该函数在做什么。 auto 什么也没告诉我。


一个更好的问题可能是......如果我们有decltype,为什么我们需要std::result_of。这些似乎更密切相关。毕竟decltype(x+1)我可以,用result_of怎么表达?! decltype 显然更好。好吧,即使在确定函数调用的结果时,两者之间也存在some slight differences

【讨论】:

    猜你喜欢
    • 2020-04-22
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    相关资源
    最近更新 更多