使用多语句lambda返回类型推导

时间:2013-01-22 02:27:02

标签: c++ c++11 lambda g++ trailing-return-type

我一直在编写代码,我最近发现g ++没有警告我某类问题:根据C ++ 11 5.1.2.4,如果你的lambda不是单一的return语句那么返回类型必须声明为trailing-return-type或者为void。

虽然g ++被允许编译无效代码,如果它有足够的意义,是否有办法关闭此行为(允许在{+ 1}}中使用g ++ - 4.7)或者最不警告它?

示例代码:

-fpedantic

C ++ 11 5.1.2.4

  

实现不应将rvalue引用类型的成员添加到闭包类型。   如果lambda表达式不包含lambda声明符,那就好像lambda声明符是()。如果lambda表达式不包含trailing-return-type,那就好像trailing-return-type表示以下类型:

     

- 如果复合语句的形式为
  {attribute-specifier-seq(opt)返回表达式; }
  lvalue-to-rvalue转换(4.1),数组到指针转换(4.2)和函数到指针转换(4.3)之后返回表达式的类型;

     

- 否则,无效。

2 个答案:

答案 0 :(得分:11)

那是因为它是标准中的缺陷,并且会被更改(参见DR 975):

  

975对lambdas的退货类型扣除的限制

     

似乎没有任何技术上的困难   要求当前限制lambda的返回类型可以   只有当lambda的身体由一个回归组成时才能推断出   声明。特别是,多个return语句可以是   如果它们都返回相同类型,则允许。

我怀疑是否有办法将其关闭。

答案 1 :(得分:1)

GCC 4.8.1(可能更早)和clang 3.3已经实现了它;修理DR975。

现在有一个提案(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3386.html)将其纳入C ++ 1y