C++ 14'auto'能够获得函数返回类型,我们还需要std :: result_of <>吗?

Hin*_*sum 1 c++ types return auto c++14

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

Bar*_*rry 5

是的,一点没错.

  1. 有时您需要返回类型,但不是函数的结果.假设我有一个vector<X>,我想将函数应用于每个元素并返回结果.这个操作被调用,map或者fmap我们可以这样实现签名:

    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 );
    
    Run Code Online (Sandbox Code Playgroud)

    您可以创建返回类型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); }
    
    Run Code Online (Sandbox Code Playgroud)

    如果F不能用a调用int,则实例化foo()是一个硬编译错误,但bar()只是从重载集中删除.这在通用代码中非常有价值,因为您可以测试表达式是否良好.

  3. 注解.auto没有告诉你关于函数返回类型的信息.如果函数返回调用带有一些args的一个callable的结果,std::result_of_t<F(A, B)>那么它本身告诉我该函数正在做什么.auto没告诉我什么.


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