C++14 'auto' 可以得到函数 return 类型,我们还需要 std::result_of<> 吗?

C++14 'auto' is able to get function return type, do we still need std::result_of<>?

好像C++14可以用auto关键字出现在函数定义的位置来表示return类型。这样的话,还需要std::result_of吗?现在不是过时了吗?

是的,绝对。

  1. 有时您需要 return 类型,但不是函数的结果。假设我有一个 vector<X> 并且我想对每个元素应用一个函数并且 return 结果。这个操作称为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 );
    

    您可以将 return 类型设为 auto,但无论如何,您需要计算该类型 Uauto 不会将其提供给您。任何时候你想要一个不一定是 return 类型的函数调用的结果,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 没有告诉您有关函数 return 类型的任何信息。如果该函数是 returning 调用一个带有一些参数的可调用函数的结果,std::result_of_t<F(A, B)> 本身就告诉我该函数在做什么。 auto 什么也没告诉我。


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