如何创建 const boost::iterator_range
How do I create a const boost::iterator_range
Why does boost::find_first take a non-const reference to its input? 处的评论建议"the caller to create a non-const iterator_range with const_iterator template parameter to "证明“迭代对象具有足够的生命周期。”
这是什么意思,我该怎么做?
特别是,我如何使用此代码实现常量正确性?
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);
对范围进行非常量引用避免绑定到临时对象¹
我会通过让编译器完成您的工作来避免您遇到的难题²:
tMyMap const& my_map; // NOTE const
// ...
return boost::make_iterator_range(my_map.lower_bound(123), mymap.upper_bound(456));
¹ 标准 C++ 延长了绑定到常量引用变量的临时对象的生命周期,但这不适用于绑定到对象成员的引用。因此,通过引用聚合范围很容易出现这种错误。
/OT:IMO 甚至 with precautions/checks 某些 Boost Range 功能(如适配器)通常使用起来太不安全;我陷入这些陷阱的次数比我愿意承认的要多。
² 除了 来自您提供的样本
Why does boost::find_first take a non-const reference to its input? 处的评论建议"the caller to create a non-const iterator_range with const_iterator template parameter to "证明“迭代对象具有足够的生命周期。”
这是什么意思,我该怎么做?
特别是,我如何使用此代码实现常量正确性?
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);
对范围进行非常量引用避免绑定到临时对象¹
我会通过让编译器完成您的工作来避免您遇到的难题²:
tMyMap const& my_map; // NOTE const
// ...
return boost::make_iterator_range(my_map.lower_bound(123), mymap.upper_bound(456));
¹ 标准 C++ 延长了绑定到常量引用变量的临时对象的生命周期,但这不适用于绑定到对象成员的引用。因此,通过引用聚合范围很容易出现这种错误。
/OT:IMO 甚至 with precautions/checks 某些 Boost Range 功能(如适配器)通常使用起来太不安全;我陷入这些陷阱的次数比我愿意承认的要多。
² 除了