【发布时间】:2017-07-11 22:41:08
【问题描述】:
似乎C++14的auto关键字可以用来出现在函数定义的位置来表示返回类型。在这种情况下,还需要std::result_of 吗?现在是不是已经过时了?
【问题讨论】:
-
使用
std::result_of代替auto声明可能更方便,然后使用decltype。拥有更多可供选择的选择和选择总是一件好事。
标签: c++ types return c++14 auto
似乎C++14的auto关键字可以用来出现在函数定义的位置来表示返回类型。在这种情况下,还需要std::result_of 吗?现在是不是已经过时了?
【问题讨论】:
std::result_of 代替auto 声明可能更方便,然后使用decltype。拥有更多可供选择的选择和选择总是一件好事。
标签: c++ types return c++14 auto
是的,绝对的。
有时你想要返回类型,但不是函数的结果。假设我有一个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 不会削减它。
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() 将简单地从重载集中删除。这在通用代码中非常有价值,因为您可以测试表达式的格式是否正确。
注释。 auto 没有告诉你函数返回类型。如果函数返回调用带有某些参数的可调用对象的结果,std::result_of_t<F(A, B)> 本身会告诉我该函数在做什么。 auto 什么也没告诉我。
一个更好的问题可能是......如果我们有decltype,为什么我们需要std::result_of。这些似乎更密切相关。毕竟decltype(x+1)我可以,用result_of怎么表达?! decltype 显然更好。好吧,即使在确定函数调用的结果时,两者之间也存在some slight differences。
【讨论】: