如何创建一个const boost::iterator_range?

3
这个链接中的评论建议“调用者使用 const_iterator 模板参数创建一个非const迭代器范围iterator_range以‘证明’被迭代的对象有足够的生命周期。”这是什么意思,我该如何实现它?特别是,我如何在此代码中实现const正确性?
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
我使用gcc 5.3和Boost 1.59在CoLiRu上编译通过。 - rhashimoto
可能是版本问题,有点奇怪。我使用的是gcc 4.8.4 / Boost 1.55。 - Thomas Johnson
1个回答

2

拥有非const引用 到范围 可以避免绑定到临时对象 ¹

通过让编译器完成工作,我会避免你的进退两难²:

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

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

¹ 标准的C++可以延长绑定到const引用变量的临时对象的生命周期,但是这不适用于绑定到对象成员的引用。因此,通过引用聚合范围非常容易出现这种错误。

/OT:在我看来,即使采取了预防措施/检查,一些Boost Range功能(如适配器)仍然经常过于不安全而无法使用;我已经陷入了这些陷阱中,而且次数比我愿意承认的要多。

² 除了我们无法从您提供的示例中复制它之外


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接