这个问题有两个部分
Firstly,有人可以解释 C++ 禁用 lambda 的复制赋值运算符背后的基本原理吗?如果您要允许复制构造函数,为什么不允许复制赋值运算符呢?
Secondly,如何在不强迫人们编写 C++03 风格函子或使用 std::function 的情况下最好地克服这个限制(我正在处理的函数很小,我希望编译器尽可能内联它们) ?
背景:
我正在尝试在 a 中实现类似 flat_map 的操作我正在写的流处理库,类似于Scala或其他函数式语言中的flatMap。因此,我需要创建一个迭代器列表的迭代器。每次取消引用 flat_map 迭代器时,都会执行与内部迭代器关联的 lambda。每次内迭代器到达末尾时,外迭代器都需要切换内迭代器。由于内部迭代器包含 lambda,因此没有复制赋值运算符,因此无法切换它。从技术上讲,我可以使用动态分配来解决问题,这样我总是调用复制构造函数,但这似乎不是正确的方法。以下是可能有助于突出问题的代码片段:
template <typename Iter>
class flat_map_iterator {
public:
flat_map_iterator& operator++() {
++it_inner_;
if (it_inner_ == (*it_outer_).end()) {
++it_outer_;
// ERROR: cannot be assigned because its copy assignment operator is implicitly deleted
it_inner_ = (*it_outer_).begin();
}
return *this;
}
private:
Iter it_outer_;
typename Iter::value_type::iterator it_inner_;
};
Edit:
感谢您的快速回复。这是一个用例示例:
int res = ftl::range(1, 4).map([](int a){
return ftl::range(a, 4).map([a](int b){
return std::make_tuple(a, b);
});
})
.flat_map([](std::tuple<int, int> x){ return std::get<0>(x) * std::get<1>(x); })
.sum();
assert(res, 25);
The ftl::range(begin, end)
函数返回范围内的惰性迭代器[begin, end)
.