C++11中在lambda表达式里按引用捕获局部变量是否合法?
C++11中在lambda表达式里按引用捕获局部变量是否合法?
没问题,你的写法是完全合法且符合C++11标准的,我来给你拆解一下为什么:
变量生命周期完全匹配:
removed是someFunc里的局部自动变量,而std::list::remove_if是同步执行的——它会在当前函数的调用栈内,一次性完成所有元素的遍历和lambda的调用,lambda的所有执行逻辑都发生在remove_if运行期间,这段时间removed的生命周期完全有效(直到someFunc执行完毕才会销毁),所以你捕获的引用不会出现悬空的情况,完全安全。不存在“捕获临时变量”的问题:你担心的“临时变量”通常是指表达式求值时产生的短暂对象(比如函数返回的临时值),但
removed是函数内的局部变量,它的生命周期和函数栈帧绑定,完全覆盖了lambda的执行周期,所以这种引用捕获是合理的,编译器也认可这一点(所以你看不到警告)。同步执行是关键:如果是把lambda传给异步任务(比如
std::async或者后台线程),那按引用捕获局部变量就会有生命周期风险,但这里remove_if是同步执行的,lambda的所有调用都在当前函数的执行流里,完全没有问题。
你的代码示例:
std::list<uint32_t> mylist; void someFunc() { bool removed = false; mylist.remove_if([&removed, this](const uint32_t & item){ if (item == 1) { removed = true; return true; } return false; }); if (removed) { // ... return; } }
另外补充一句:这种写法其实是C11里应对std::list::remove_if无返回值的常见技巧——因为C11的list::remove_if确实不像后续标准那样返回移除的元素数量,所以用捕获的变量来标记是否有元素被移除是非常合理的做法。
备注:内容来源于stack exchange,提问作者SticilFace
相关产品推荐
相关产品推荐

