2012-10-31 76 views
6

可能重复:
What is “->” after function declaration?使用 - >函数声明

我刚刚遇到的使用新auto关键字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; 
}; 

具体而言,我感到困惑的->在函数签名的用户,我期望这些被写在作为

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

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

什么是->运营商在那里做什么,在哪里我可以学习更多关于这个语法吗?

回答

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的返回类型,则必须使用这种形式;虽然,正如你所指出的,在很多情况下(包括这一个),你根本不需要指定。

2

此语法(所谓尾返回型)可以使用表达式作为返回类型,如下面的一种解决方法:

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

...不会在C++正确。

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

+1

...这是不正确的,因为它在范围之前使用't'和'u'(它们只在参数列表中声明)。 –

0

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

3

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

自动类型说明符可以用具有尾返回型的函数声明符出现(8.3 .5)在这种声明有效的任何情况下。

然后在[dcl。fct]/12,有一个注释:

当函数的返回类型很复杂时,typedefs和trailing-return-types有时很方便。例如,上面的功能fpif可能已宣布

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

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

尾随收益型是一种类型,这将是更加复杂的声明符-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); 
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)的类型。

1

有什么 - >运营商那里做,我在哪里可以了解这个语法的更多 ?

关于这个cprogramming有一个很好的解释。

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

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

在您的备选例子的情况下:

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

如果该功能是相当复杂的,那么这将是你的程序的读者相当困难的(没有明显的明显)弄清楚什么预期收益类型是。