从lambda函数构造的boost :: function_output_iterator不可赋值

时间:2016-02-14 14:32:28

标签: c++ c++11 boost lambda

请考虑以下代码段:

auto f = [](int x) { std::cout << x; };
auto it = boost::make_function_output_iterator(f);
decltype(it) it2 = it;  // Ok, copied
it2 = it;  // Does not compile, cannot assign!

问题是,以这种方式构造的function_output_iterator是不可分配的,因此不满足Iterator概念,它要求类型为CopyAssignable

这不是错误,因为boost Function Output Iterator documentation明确says

  

UnaryFunction必须是可分配和复制可构造的。

删除lambda function的赋值运算符时:

ClosureType& operator=(const ClosureType&) = delete;

所以这种行为在技术上是正确的,但对我来说有些出乎意料。我认为,给定由lambda函数生成的闭包,构造function_output_iterator是一个非常合理的愿望。对我来说这个用例导致问题的原因似乎不方便。

嗯,好吧,这个StackOverflow,所以我不得不问一些问题:)这里是:如何解决这个问题?如何在给定闭包的情况下获得正确的迭代器,其作用类似于function_output_iterator

另一个问题:是否值得提出提案或提交错误报告?

2 个答案:

答案 0 :(得分:11)

另一种选择,如果你确定闭包将比迭代器及其副本更长,请用std::ref包装它:

auto f = [](int x) { std::cout << x; };
auto it = boost::make_function_output_iterator(std::ref(f));

Demo

以下是针对修复此特定问题的boost实用程序类的提议:boost::regular

请参阅boost mailing list中的相应讨论。

答案 1 :(得分:5)

只需将关闭保存在std::function

std::function<void(int)> f = [](int x) { std::cout << x; };
auto it = boost::make_function_output_iterator(f);

Test snippet.