为何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
相关产品推荐
相关产品推荐

