lambda – C 0x闭包的未定义行为:I
发布时间:2020-12-16 07:25:03 所属栏目:百科 来源:网络整理
导读:考虑这个例子: #include iostream#include functional // std::function#include vector // std::vector#include algorithm // std::for_eachint main(){ auto adder = [](int x) { return [](int y) { return x+=y; }; }; std::vector std::functionint(in
考虑这个例子:
#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])而不是参考([&])捕获,一切都应该有效. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |