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

Ste*_*mba 2 c++ lambda if-statement conditional-operator

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

transform(vi.begin(), vi.end(), vi.begin(),
      [](int i) { if (i < 0) return -i; else return i; });
Run Code Online (Sandbox Code Playgroud)

作者说:

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

但是当我在 Windows 上用 GNU GCC Compiler 编译这段代码时,它运行良好。

作者还说:

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

transform(vi.begin(), vi.end(), vi.begin(),
          [](int i) { return i < 0 ? -i : i; });
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是:

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

Edg*_*jān 5

lambda

...闭包的 operator() 的返回类型根据以下规则确定:

  • 如果主体仅由带有表达式的单个 return 语句组成,则返回类型为返回表达式的类型(在左值到右值、数组到指针或函数到指针的隐式转换之后);否则,返回类型为 void。(直到 C++14)

  • 返回类型是从 return 语句中推导出来的,就像返回类型声明为 auto 的函数一样。(C++14 起)

所以作者只是描述了C++14之前的情况,从C++14开始代码就完美了。