似乎C++ 14 auto
关键字可用于出现在函数定义的位置,以指示返回类型。在这种情况下,是否仍然需要std::result_of
?现在不是过时了吗?
最佳答案
是的,一点没错。
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 );
您可以将返回类型设置为
auto
,但是无论如何,您都需要计算该类型U
,而auto
不会将其提供给您。任何时候只要您希望函数调用的结果不一定是返回类型,auto
都不会削减它。 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()
只会从重载集中删除。这对于通用代码非常有值(value),因为您可以测试表达式的格式。 auto
告诉您关于函数返回类型的任何信息。如果该函数返回调用带有一些args的可调用结果,则std::result_of_t<F(A, B)>
本身会告诉我该函数在做什么。 auto
什么也没告诉我。 确实更好的问题可能是...如果我们有
std::result_of
,为什么我们需要decltype
。这些似乎更紧密相关。毕竟,我可以做decltype(x+1)
,如何用result_of
表示呢? decltype
显然更好。好吧,事实证明,即使要确定函数调用的结果,两者之间也存在some slight differences。关于c++ - C++ 14 'auto'能够获取函数返回类型,我们还需要std::result_of <>吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42382051/