8

我一直在编写代码,最近发现 g++ 不会警告我某类问题:根据 C++11 5.1.2.4,如果您的 lambda 不是单个返回语句,则返回类型必须声明为尾随返回类型或无效。

尽管如果 g++ 足够有意义,则允许编译无效代码,但有没有办法关闭此行为(-fpedantic在 g++-4.7 中允许)或至少对此发出警告?

示例代码:

[]() { return 0; } //is fine
[&a]() { a++; return 0; } //is not fine but g++ doesn't warn me
[&a]() -> int {a++; return 0; } //is fine again

C++11 5.1.2.4

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

— 如果复合语句的形式为
{ attribute-specifier-seq(opt) return expression ;
左值到右值转换(4.1)、数组到指针转换(4.2)和函数到指针转换(4.3)后返回表达式的类型;

——否则,无效。

4

2 回答 2

11

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

975 对 lambda 的返回类型推导的限制

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

我怀疑是否有办法关闭它。

于 2013-01-22T02:35:37.410 回答
1

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

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

于 2013-10-15T09:19:11.670 回答