繁体   English   中英

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

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

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

是的,一点没错。

  1. 有时,您需要返回类型,而不是函数的结果。 假设我有一个vector<X> ,我想对每个元素应用一个函数并返回结果。 此操作称为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 ,但是无论如何,您都需要计算该类型Uauto不会将其提供给您。 每当您希望函数调用的结果不一定是返回类型时, 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<F(A, B)>本身会告诉我该函数在做什么。 auto告诉我什么。


确实更好的问题可能是...如果我们有decltype为什么我们需要std::result_of 这些似乎更紧密相关。 毕竟,我可以做decltype(x+1) ,如何用result_of呢! decltype类型显然更好。 好吧,事实证明,即使在确定函数调用的结果时, 两者之间也存在一些细微的差异

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM