函数标题中的箭头运算符( - >)

时间:2014-03-19 18:22:58

标签: c++ c++11 auto decltype

我找到了这样的代码:

template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) {
   return a+b;
}

我想到了所有细节,这对我来说是新的,但只有一个。 请告诉我,在哪里可以阅读,箭头操作符(->)在函数标题中的含义是什么? 我认为纯粹逻辑上,->运算符确定了一个类型,它将由auto获得,但我想直截了当,但无法找到信息。

2 个答案:

答案 0 :(得分:151)

在C ++ 11中,函数声明有两种语法:

return-type 标识符 ( 参数声明... )

auto 标识符 ( 参数声明... ) -> return_type

它们是等价的。现在当它们相同时,你为什么要使用后者呢?好吧,C ++ 11引入了这个很酷的decltype东西,可以让你描述一个表达式的类型。因此,您可能希望从参数类型派生返回类型。所以你试试:

template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);

并且编译器会告诉您它不知道a参数中的bdecltype是什么。那是因为它们只是由参数列表声明。

您可以使用declval和已声明的模板参数轻松解决此问题。像:

template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);

除了它现在变得非常冗长。因此,提出并实现了备用声明语法,现在您可以编写

template <typename T1, typename T2>
auto compose(T1 a, T2 b) -> decltype(a + b);

并且它不那么冗长,并且范围规则不需要改变。


C ++ 14更新: C ++ 14也允许

auto 标识符 ( 参数声明... )

只要函数在使用前完全定义,并且所有return语句推导为相同类型。如果要在源文件中隐藏正文,->语法对公共函数(在标题中声明)仍然有用。显然有些模板无法完成,但有一些具体的类型(通常是通过模板元编程推导出来的)很难写出来。

答案 1 :(得分:17)

简单地说,它告诉返回类型是ab之和的推断类型。