什么是 - >在函数声明中的c ++中

foo*_*oty 4 c++ syntax decltype c++11

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

虽然我理解了这个函数背后的动机,但我并不理解它使用的语法,特别->是声明中的语法.什么是 - >以及如何解释?

编辑1

基于以上所述:这里有什么问题?

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

错误是:

error: expected type-specifier before ‘decltype’
error: expected initializer before ‘decltype
Run Code Online (Sandbox Code Playgroud)

回复编辑1:

OOPS!我忘了-std=c++11在g ++中使用编译器选项.

编辑2

基于以下答案.我有一个相关的问题:看下面的声明:

template <typename T1, typename T2>
decltype(*(T1 *) nullptr + *(T2 *) nullptr) sum2(T1 v1, T2 v2);
Run Code Online (Sandbox Code Playgroud)

它在函数声明中decltype不需要使用->.那么我们为什么需要呢->

And*_*owl 10

这使用尾随返回类型表示法.这个:

auto f() -> T { ... }
Run Code Online (Sandbox Code Playgroud)

相当于:

T f() { ... }
Run Code Online (Sandbox Code Playgroud)

优点是使用尾随返回类型表示法,您可以根据涉及参数的表达式表示函数的类型,这是经典表示法无法实现的.例如,这将是非法的:

    template <class T>
    decltype(foo(t)) transparent_forwarder(T& t) {
//  ^^^^^^^^^^^^^^^^
//  Error! "t" is not in scope here...

        return foo(t);
    }
Run Code Online (Sandbox Code Playgroud)

关于你的编辑:

基于以上所述:这里有什么问题?

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

没有.

关于你的第二次编辑:

[...]在函数声明中使用decltype而不需要 - >.那么我们为什么需要 - >

在这种情况下,您不需要它.但是,使用尾随返回类型的符号更清晰,因此可能更喜欢它使代码更容易理解.