如何创建const boost :: iterator_range

时间:2016-04-01 20:23:09

标签: c++ boost iterator const const-iterator

Why does boost::find_first take a non-const reference to its input?处的注释表明“调用者使用const_iterator模板参数创建非const iterator_range以”证明“迭代对象具有足够的生命周期。”

这意味着什么,我该怎么做?

特别是,如何使用此代码实现const-correctness?

typedef std::map<int, double> tMyMap;
tMyMap::const_iterator subrange_begin = my_map.lower_bound(123);
tMyMap::const_iterator subrange_end = my_map.upper_bound(456);

// I'd like to return a subrange that can't modify my_map
// but this vomits template errors complaining about const_iterators
return boost::iterator_range<tMyMap::const_iterator>(subrange_begin, subrange_end);  

1 个答案:

答案 0 :(得分:2)

在范围中使用非const引用可以避免绑定到临时值¹

通过让编译器完成你的工作,我可以避免你的难题:

tMyMap const& my_map; // NOTE const
// ...

return boost::make_iterator_range(my_map.lower_bound(123), mymap.upper_bound(456));

¹标准C ++延长了绑定到const-reference变量的临时生命周期,但这不适用于绑定到对象成员的引用。因此,通过引用汇总范围很容易出现这种错误。

/ OT:IMO甚至 注意事项/检查一些Boost Range功能(如适配器)通常使用起来太不安全了;我经常陷入陷阱,而不是承认。

²除了您提供的样本we cannot reproduce it

之外