我正在阅读C ++入门第5版,第10章(lambdas表达式),这是一个程序,旨在用它们的绝对值替换向量中的负值。
transform(vi.begin(), vi.end(), vi.begin(),
[](int i) { if (i < 0) return -i; else return i; });
作者说:
这段代码不会编译,因为lambda将返回类型推断为
void
,但我们返回了一个值并修复了这个问题,我们必须使用尾随返回类型。
但是当我在Windows上使用GNU GCC Compiler编译此代码时,它运行良好。
作者还说:
这个版本编译因为我们不需要指定返回类型, 因为该类型可以从条件的类型推断出来 操作
transform(vi.begin(), vi.end(), vi.begin(),
[](int i) { return i < 0 ? -i : i; });
所以,我的问题是:
答案 0 :(得分:4)
来自lambda:
...闭包的operator()的返回类型是根据确定的 以下规则:
如果正文只包含一个带有的返回语句 表达式,返回类型是返回表达式的类型 (在左值到右值,数组到指针或函数到指针之后) 隐式转换);否则,返回类型无效。 (直到 C ++ 14)
返回类型是从return语句中推导出来的,就像函数一样 其返回类型声明为auto。 (自C ++ 14起)
所以作者只是描述了C ++ 14之前的情况,因为C ++ 14代码完美无缺。