首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >if-else语句lambda表达式的返回类型推导

if-else语句lambda表达式的返回类型推导
EN

Stack Overflow用户
提问于 2017-12-13 18:09:37
回答 1查看 709关注 0票数 3

我正在阅读C++引物第5版,第10章(lambdas表达式),这是一个程序,旨在用它们的绝对值替换向量中的负值。

代码语言:javascript
复制
transform(vi.begin(), vi.end(), vi.begin(),
      [](int i) { if (i < 0) return -i; else return i; });

提交人说:

这段代码不会编译,因为lambda将返回类型推断为void,但是我们返回了一个值,要解决这个问题,我们必须使用尾随返回类型。

但是,当我在Windows上用GNU GCC编译器编译这段代码时,它工作得很好。

提交人还说:

此版本编译是因为我们不需要指定返回类型,因为可以从条件运算符的类型推断该类型。

代码语言:javascript
复制
transform(vi.begin(), vi.end(), vi.begin(),
          [](int i) { return i < 0 ? -i : i; });

所以,我的问题是:

  • 为什么在第一个版本中,lambda将返回类型推断为void,以及为什么GNU GCC编译器会接受这个。*(我认为可能是因为优化)。?
  • 为什么第二个版本可以从条件运算符的类型推断返回类型?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-13 18:26:35

来自兰卜达

..。根据以下规则确定闭包的操作符()的返回类型:

  • 如果主体只包含一个带有表达式的返回语句,则返回类型是返回表达式的类型(在lvalue到rvalue、数组到指针或函数到指针的隐式转换之后);否则,返回类型是无效的。(直到C++14)
  • 返回类型是从返回语句中推导出来的,就好像对于一个函数,其返回类型被声明为auto一样。(自C++14以来)

因此,作者只是在C++14之前描述了情况,因为C++14代码工作得很好。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47799615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档