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