我一直在编写代码,我最近发现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)之后返回表达式的类型;- 否则,无效。
答案 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