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

what is -> in c++ in a function declaration

本文关键字:gt 是什么 中的 声明 C++ 函数      更新时间:2023-10-16

在维基百科关于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编译器选项。

编辑2

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

template <typename T1, typename T2>
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);
    }

关于你的编辑:

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

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

关于你的第二次编辑:

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

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