【发布时间】:2013-10-13 12:01:30
【问题描述】:
我目前正在使用 c++11 lambda,发现了一个我无法理解的示例。根据标准:
最小封闭范围是块范围(3.3.3)的 lambda 表达式是本地 lambda 表达式;任何 其他 lambda-expression 在其 lambda-introducer 中不应有捕获列表
所以,我创建了一个简单的例子:
int a = 10;
auto x = [a] { return 1;};
int main() {
int k = 5;
auto p = [k]{ return k; };
return 0;
}
ideone中的代码:http://ideone.com/t9emu5
我原以为这段代码不会编译,因为在非块范围内捕获变量(或者至少认为 auto x = ... 部分不在块范围内)。但是代码正在编译 - 可以吗?
如果可以 - 块范围是什么?
(我不确定我使用的是什么编译器版本,因为目前我只能访问 ideone 站点。
感谢您的解释!
【问题讨论】:
-
那么,什么是非块范围?
-
@DanielFrey 嗯?块是复合语句,命名空间当然不是块。参见 [basic.scope.block]/1 和 [stmt.block]
-
@DyP 对不起,我弄糊涂了。你完全正确!
-
@KerrekSB:不,我不这么认为。这个问题是特定于 lambda 捕获的。
-
+1:听起来可能是 GCC 错误,尤其是当 clang 发现代码存在另一个问题时。