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);
答案 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
之外