n3290的一点:ISO标准草案,§5.1.2/ 9
lambda-expression ,其最小的封闭范围是块范围(3.3.3) 是本地lambda表达式;任何其他 lambda-expression 都不应该有 capture-list 在 lambda-introducer 中。 到达范围的本地 lambda表达式是包含范围的集合,包括 最里面的封闭函数及其参数。 [注意:此范围包括任何介入的 lambda-expression - 结束记录]
任何人都可以给出上述观点,特别是:“其他lambda-expression在其lambda-introduction中不应该有一个捕获列表。” 这种情况出现在哪里?
答案 0 :(得分:6)
理论上应该在命名空间范围内出现这种情况,正如his comment link中@ Space_C0wb0y所示。
#include <iostream>
int x = 12;
auto l = [&x](){ return x; };
int main() {
std::cout << l() << std::endl;
}
如果发现GCC接受该代码段很奇怪,因为MSVC正确拒绝它,并显示以下错误消息:
错误C3480:'x':lambda捕获变量必须来自封闭的函数范围