提问者:小点点

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


我遇到了以下代码:

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

有一件事我不能理解:

在哪里可以找到函数标题中的箭头运算符(code->/code>)是什么意思?我完全从逻辑上猜测,/code>运算符确定了一个类型,将被推论为该类型,但我想要弄清楚这一点。我找不到任何信息。


共2个答案

匿名用户

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

    返回-类型标识符argument-declarations...

    codeauto/code>标识符argument-declarations.../code>

它们是等价的。现在当它们是等价的时候,你为什么还想用后者呢?C++11引入了这个很酷的,它允许您描述表达式的类型。因此您可能希望从参数类型派生返回类型。所以你试着:

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

编译器会告诉您它不知道参数中的是什么。这是因为它们仅由参数列表声明。

您可以通过使用和已经声明的模板参数轻松解决这个问题。如:

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也只允许

    CodeAuto/code>标识符argument-declarations...

只要函数在使用前被完全定义,并且所有的语句都推导为相同的类型。如果希望在源文件中隐藏正文,/code>语法对于公共函数(在头中声明)仍然很有用。显然,模板不能做到这一点,但是有些具体的类型(通常通过模板元编程派生)很难用其他方式编写。

匿名用户

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