【发布时间】:2013-01-22 02:27:01
【问题描述】:
我一直在编写代码,最近发现 g++ 不会警告我某类问题:根据 C++11 5.1.2.4,如果您的 lambda 不是单个 return 语句,那么返回类型必须声明为尾随返回类型或为 void。
虽然 g++ 允许编译无效代码,如果它足够有意义的话,有没有办法关闭这种行为(在 g++-4.7 中允许 -fpedantic)或者至少警告它?
示例代码:
[]() { 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 表示以下类型:
——如果复合语句的形式是
{ 属性说明符序列(选择)返回表达式; }
左值到右值转换(4.1)、数组到指针转换(4.2)和函数到指针转换(4.3)后返回的表达式的类型;——否则,无效。
【问题讨论】:
-
+1 我注意到了,但我从未想过要尝试修复它。
-
这不是一个扩展吗,就像只有一个语句一样推导出回报,他们期望这将被标准化?
-
@Potatoswatter,在这种情况下,它会在 VLA 上发出警告,那么为什么不这样做呢?
-
clang 3.2 和 VS2012 也接受该代码。
-
这意味着如果你没有参数,你可以像这样声明你的 lambda:
[]{return 0;}
标签: c++ c++11 lambda g++ trailing-return-type