箭头运算符( – >)在函数标题中

我发现这样的代码:

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

我想到了所有的细节,这些细节对我来说是新的,但是其中之一。 请告诉我,我在哪里可以阅读,在function标题中箭头运算符( -> )是什么意思? 我想纯粹逻辑上,那->运算符决定一个types,这将通过auto得到,但我想得到这个直,但不能find信息。

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

返回types 标识符 ( 参数声明… )

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

它们是相同的。 现在,当他们相当时,你为什么要使用后者? 那么,C ++ 11介绍了这个很酷的decltype东西,可以让你描述一个expression式的types。 所以你可能想从参数types派生返回types。 所以你试试:

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

编译器会告诉你,它不知道在decltype参数中ab是什么。 那是因为它们只是由参数列表声明的。

通过使用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语句都被推断为相同的types。 如果要隐藏源文件中的正文,则->语法对于公共函数(在头文件中声明)仍然有用。 有些显然不能用模板完成,但是有一些具体的types(通常是通过模板元编程派生的),否则很难写。

用简单的英文表示返回types是ab之和的推断types。