n3290:ISO标准草案,§5.1.2/ 9
甲λ-表达其最小包围范围是块范围(3.3.3)是本地lambda表达式 ; 任何其他lambda-expression在其lambda-introducer中都不应该有一个 capture-list.本地lambda表达式的到达范围是包含范围的集合,包括最里面的封闭函数及其参数.[ 注意:这个范围包括任何介入的lambda表达式 - 结束语 ]
任何人都可以为上述观点做一个例子,特别是: "其他lambda表达式在其lambda介绍者中不应该有一个捕获列表." 这种情况出现在哪里?
理论上应该在命名空间范围内出现这种情况,如@Space_C0wb0y在他的评论链接中所示.
#include <iostream>
int x = 12;
auto l = [&x](){ return x; };
int main() {
std::cout << l() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
如果发现GCC接受该片段很奇怪,因为MSVC正确拒绝它,并显示以下错误消息:
错误C3480:'x':lambda捕获变量必须来自封闭的函数作用域