箭头运算符( – >)在函数标题中
我发现这样的代码:
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
参数中a
和b
是什么。 那是因为它们只是由参数列表声明的。
通过使用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是a
和b
之和的推断types。