你能举一个关于这一点的例子:lambda-expression

时间:2011-05-24 14:01:32

标签: c++ c++11 lambda

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中不应该有一个捕获列表。” 这种情况出现在哪里?

1 个答案:

答案 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捕获变量必须来自封闭的函数范围