6

可能重复:
函数声明后的“->”是什么?

我刚刚遇到以下使用 newauto关键字的 C++ 函数示例,我希望有人能帮助我理解语法的含义。

template <class T, class U>
auto add(T t, U u) -> decltype(t + u);

auto f = [](int a, int b) -> int {
   return a*b;
};

具体来说,我->对函数签名中的用户感到困惑,我希望这些写在 as

template <class T, class U>
auto add(T t, U u)
{
    decltype(t + u);
}

auto f = [](int a, int b){
    return a*b;
};

操作员在那里做什么->,我在哪里可以了解有关此语法的更多信息?

4

6 回答 6

13

操作员在里面做什么->

这是一个尾随返回类型。代替:

int f();

你可以等效地写:

auto f() -> int;

如果返回类型取决于函数参数类型,则需要使用这种形式;参数在声明之前不可用:

decltype(t+u) add(T t, U u); // Error: uses `t` and `u` before they're declared
auto add(T t, U u) -> decltype(t + u); // OK

另外,如果你想指定一个 lambda 的返回类型,那么你必须使用这种形式;但是,正如您所指出的,在许多情况下(包括这个),您根本不需要指定。

于 2012-10-31T12:55:03.553 回答
3

[dcl.spec.auto]/2 解释了如何编写具有自动返回类型的函数声明:

在此类声明符有效的任何上下文中,自动类型说明符可能与带有尾随返回类型(8.3.5)的函数声明符一起出现。

然后,在 [dcl.fct]/12 中,有一条注释:

当函数的返回类型很复杂时,类型定义和尾随返回类型有时很方便。例如,上面的函数 fpif 可以被声明

typedef int IFUNC(int);
IFUNC* fpif(int);

或者

auto fpif(int)->int(*)(int)

trailing-return-type 对于在 declarator-id 之前指定更复杂的类型最有用:

template <class T, class U> auto add(T t, U u) -> decltype(t + u);

而不是

template <class T, class U> decltype((*(T*)0) + (*(U*)0)) add(T t, U u);
于 2012-10-31T12:57:16.350 回答
2

此语法(所谓的 trailing-return-type)是使用表达式作为返回类型的解决方法,如下所示:

template <class T, class U>
   decltype(t + u) add(T t, U u) { ... }

...在 C++ 中是不正确的。

不得不说这个问题在Wiki中解释得很好(我想)。

于 2012-10-31T12:54:14.447 回答
1

->尾随返回类型

C++11 提出了另一种函数声明语法。 auto关键字代替了通常的函数返回类型,而实际的返回类型在->.

例如,

auto f (int a, int b) -> int;

相当于

int f(int a, int b);

此功能对于必须从模板参数推断返回类型的模板函数最有用。

例如,

template <class T, class U>
auto add(T t, U u) -> decltype(t + u);

返回类型将是表达式的类型(t+u)

于 2012-10-31T13:00:02.390 回答
1

-> 运算符在其中做什么,我在哪里可以了解有关此语法的更多信息?

在cprogramming上有一个很好的解释。

使用 -> (在您的情况下)或 auto,decltype 的本质是方便,让您更专注于编程逻辑。

尾随返回类型(->) 可帮助您在函数声明本身中包含返回类型信息。

如果是您的替代示例:

auto add(T t, U u)
{
    decltype(t + u);
}

如果函数相当复杂,那么程序的读者很难(不是很明显)弄清楚预期的返回类型是什么。

于 2012-10-31T13:09:52.993 回答
0

函数声明中的 -> 运算符指定返回“auto”的函数的返回类型。它在 C++11 标准的第 8 章中定义。

于 2012-10-31T12:56:58.783 回答