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

新手上路,请多包涵

我遇到了以下代码:

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

有一件事我无法理解:

我在哪里可以找到箭头运算符( -> )在函数标题中的含义?

我想纯粹从逻辑上讲, -> 运算符确定了一种类型,即 auto 将被推导出来,但我想弄清楚这一点。我找不到任何信息。

原文由 user1234567 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 972
2 个回答

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

返回类型 标识符 ( 参数声明 )

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

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

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

编译器会告诉你它不知道 abdecltype 参数中。那是因为它们仅由参数列表声明。

您可以使用 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 语句都推断为相同的类型。如果您想在源文件中隐藏正文,则 -> 语法对于公共函数(在标头中声明)仍然有用。显然,模板无法做到这一点,但有一些具体类型(通常通过模板元编程派生)很难以其他方式编写。

原文由 Jan Hudec 发布,翻译遵循 CC BY-SA 3.0 许可协议

用简单的英语它告诉返回类型是 ab 之和的推断类型。

原文由 murrekatt 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题