在C++函数声明中,"->"是用来指定函数返回类型的符号。

4
在维基百科的 decltype 文章中http://en.wikipedia.org/wiki/Decltype,我遇到了这个例子:
int& foo(int& i);
float foo(float& f);

template <class T> auto transparent_forwarder(T& t) −> decltype(foo(t)) {
  return foo(t);
}

尽管我理解了这个函数背后的动机,但我并不理解它使用的语法,尤其是声明中的->。什么是->,它如何被解释?
编辑1:
基于上述内容:这里有什么问题?
template <typename T1, typename T2>
auto sum(T1 v1, T2 v2) -> decltype(v1 + v2) {
    return v1 + v2;
}

错误信息如下:
error: expected type-specifier before ‘decltype’
error: expected initializer before ‘decltype

回答 EDIT 1:

糟糕!我忘记在 g++ 中使用 -std=c++11 编译选项。

EDIT 2:

根据下面的答案,我有一个相关的问题:请看下面的声明:

template <typename T1, typename T2>
decltype(*(T1 *) nullptr + *(T2 *) nullptr) sum2(T1 v1, T2 v2);

在函数声明中使用decltype,无需使用->。那么我们为什么需要->呢?


4
http://www.stroustrup.com/C++11FAQ.html#suffix-return - user1508519
对于所有投票支持关闭此问题的人,请注意,经过我的编辑,这个问题与链接的问题不同。请再次查看。 - footy
@footy:如果您有新的问题,请提出新的问题。SO是一个问答网站,而不是一个线程讨论网站。 - MSalters
1个回答

10

这里使用了尾置返回类型符号。具体来说:

auto f() -> T { ... }

等同于:

T f() { ... }

优点在于使用尾返回类型符号可以根据涉及参数的表达式来表示函数的类型,这是经典符号无法实现的。例如,下面这个是不合法的:
    template <class T>
    decltype(foo(t)) transparent_forwarder(T& t) {
//  ^^^^^^^^^^^^^^^^
//  Error! "t" is not in scope here...

        return foo(t);
    }

关于您的编辑:


涉及到您的编辑:

Based on the above: What is wrong here?

template <typename T1, typename T2>
auto sum(T1 v1, T2 v2) -> decltype(v1 + v2) {
    return v1 + v2;
}

没有内容。

关于您的第二次编辑:

[...] 它在函数声明中使用decltype而无需使用->。那么我们为什么需要->呢?

在这种情况下,您不必须使用它。然而,使用尾置返回类型的符号更加清晰,因此可以选择它以使代码更易于理解。


我添加了实际的错误信息。 - footy
1
@footy:我也是这么想的;)现在你可以稍微玩弄一下它。 - Andy Prowl
@footy:这不是正确使用SO的方式 :) 如果您有新问题,请提出新问题,而不是编辑已经回答的问题,否则我将不得不继续提出更多的问题,希望您最终接受我的答案 ;) - Andy Prowl
我将开始一个新的问题! - footy
谢谢!好的,我把它放回去了。不会对进一步的问题造成影响 :P - footy
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接