You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何std::插入迭代器无法在Lambda中正常使用?问题解析与解决

问题与解决:插入迭代器在Lambda中捕获后的编译错误

问题背景

一开始误以为std::back_insert_iterator、std::front_insert_iterator和std::insert_iterator不可复制,觉得它们的构造函数、赋值运算符都不支持复制操作,而且内部的container属性(以及std::insert_iterator里的iter)是protected的,想把这类插入迭代器复制到Lambda函数中用来后续填充容器时遇到了阻碍。

后来发现这类迭代器实际上是可以复制的,但捕获到Lambda中后会变成const版本,导致以下代码编译失败:

#include <functional>
#include <vector>
#include <iterator>

template<class OutIter>
inline std::function<void(int)>
generateFunction(OutIter out_iter) {
    return
        [out_iter] (int value) {
            *out_iter = value;
            ++out_iter;
        };
}

int main() {
    std::vector<int> v;
    auto myFn = generateFunction(std::back_inserter(v));

    myFn(1);
    myFn(2);
}

报错信息

<source>:10:13: error: passing 'const std::back_insert_iterator<std::vector<int> >' as 'this' argument discards qualifiers [-fpermissive]
   10 |             *out_iter = value;

解决方案

在Lambda表达式中添加mutable关键字即可解决问题,修正后的代码如下:

template<class OutIter>
inline std::function<void(int)>
generateFunction(OutIter out_iter) {
    return
        [out_iter] (int value) mutable {
            *out_iter = value;
            ++out_iter;
        };
}

内容的提问来源于stack exchange,提问作者Marcus Hampel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:00:55