lambda – C 0x闭包的未定义行为:I

考虑这个例子:

#include <iostream>
#include <functional>     // std::function
#include <vector>        // std::vector
#include <algorithm>    // std::for_each

int main(){

    auto adder = [](int x) {
        return [&](int y) { 
            return x+=y; 
        }; 
    };

    std::vector < std::function<int(int)> > vec;

    vec.push_back(adder(1));
    vec.push_back(adder(10));

    std::for_each(vec.begin(),vec.end(),[](std::function<int(int)> f){std::cout << f(33) << " ";});
    std::cout << std::endl;
}

一个期望整数34和43 43和76,但gcc 4.6.0产生“内部编译器错误:分段错误”.代码有什么问题?

编辑:here讨论了其他几个例子.

解决方法

(编辑:这当然不能解释ICE;我太匆忙地读了原来的问题.)

代码中的一个问题是,从加法器函数返回的lambda包含对不再存在的x变量的悬空引用.通过复制([=]或[i])而不是参考([&])捕获,一切都应该有效.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...