2016-04-01 78 views
3

Why does boost::find_first take a non-const reference to its input?的評論建議「調用者創建一個帶const_iterator模板參數的非const iterator_range來」證明「迭代對象具有足夠的生命週期。如何創建const boost :: 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和CoLiRu升壓1.59(http://coliru.stacked-crooked.com/a/2bd88699b279a77a)2分開。 – rhashimoto

+0

奇怪,也許是版本問題。我是gcc 4.8.4/Boost 1.55 –

回答

2

有非const引用到¹避免結合的臨時範圍

我會避免你的conundrum²通過讓編譯器做你的工作:

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

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

¹標準C++延伸了綁定到const引用變量的臨時對象的生命週期,但是這不適用於綁定到對象成員的引用。因此,通過引用匯總範圍很容易出現這種錯誤。

/OT:IMO甚至注意事項/檢查某些Boost Range功能(如適配器)常常太不安全;我經常陷入那些陷阱中,而不是我所願意承認的。

的事實,we cannot reproduce it從樣品您使用了

相關問題