if-else语句

时间:2017-12-13 18:09:38

标签: c++ if-statement lambda conditional-operator

我正在阅读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; });

所以,我的问题是:

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

1 个答案:

答案 0 :(得分:4)

来自lambda

  

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

     
      
  • 如果正文只包含一个带有的返回语句   表达式,返回类型是返回表达式的类型   (在左值到右值,数组到指针或函数到指针之后)   隐式转换);否则,返回类型无效。 (直到   C ++ 14)

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

  •   

所以作者只是描述了C ++ 14之前的情况,因为C ++ 14代码完美无缺。