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

C++ 什么是->;在c++;在函数声明中,c++,syntax,c++11,decltype,C++,Syntax,C++11,Decltype,在维基百科关于decltype的文章中,我遇到了这个例子: int& foo(int& i); float foo(float& f); template <class T> auto transparent_forwarder(T& t) −> decltype(foo(t)) { return foo(t); } 错误是: error: expected type-specifier before ‘decltype’ error:

在维基百科关于
decltype
的文章中,我遇到了这个例子:

int& foo(int& i);
float foo(float& f);

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

error: expected type-specifier before ‘decltype’
error: expected initializer before ‘decltype
编辑答案1:

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

编辑2

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

template <typename T1, typename T2>
decltype(*(T1 *) nullptr + *(T2 *) nullptr) sum2(T1 v1, T2 v2);
模板
decltype(*(T1*)nullptr+*(T2*)nullptr)sum2(T1 v1,T2 v2);
它使用的是
decltype
,而不需要在函数声明中使用
->
。那么为什么我们需要
->

这使用了尾随返回类型表示法。这:

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);
    }
模板
decltype(foo(t))透明货运代理(t&t){
//  ^^^^^^^^^^^^^^^^
//错误!“t”不在此处的范围内。。。
返回foo(t);
}
关于您的编辑:

基于以上:这里出了什么问题

template <typename T1, typename T2>
auto sum(T1 v1, T2 v2) -> decltype(v1 + v2) {
    return v1 + v2;
}
模板
自动求和(T1 v1,T2 v2)->decltype(v1+v2){
返回v1+v2;
}
没什么

关于你的第二次编辑:

[…]它正在使用decltype,而不需要在函数声明中使用->。那么为什么我们需要->


在这种情况下,你不需要它。但是,使用尾随返回类型的表示法要清楚得多,因此人们可能更希望它使代码更容易理解。

所有投票支持结束此问题的人。这个问题不同于我编辑后的链接问题。再看一遍。@footy:如果你有新问题,问一个新问题。问答网站也是如此,而不是线程化讨论网站。我添加了实际的错误消息。@footy:你的编译器是什么?。。啊,我现在明白了。。我忘了在g++@footy中使用
-std=c++11
选项:我想是的;)好吧,现在你可以玩它了bit@footy:这不是使用SO的正确方法:)如果您有新问题,请提出新问题,而不是编辑已回答的问题,否则我将不得不不断提出更多问题,希望您最终接受我的答案;)
template <typename T1, typename T2>
auto sum(T1 v1, T2 v2) -> decltype(v1 + v2) {
    return v1 + v2;
}