[iterators] fix return of a reference to a temporary object when using closing_iterator and ever_circling_iterator with transformed ranges.

This commit is contained in:
Phillip Palk
2018-06-07 10:07:48 +10:00
parent 43538e5f24
commit 1d7a38fbee
2 changed files with 11 additions and 5 deletions

View File

@@ -38,9 +38,12 @@ struct closing_iterator
<
closing_iterator<Range>,
typename boost::range_value<Range>::type const,
boost::random_access_traversal_tag
boost::random_access_traversal_tag,
typename boost::range_reference<Range>::type const,
typename boost::range_difference<Range>::type
>
{
typedef typename boost::range_reference<Range>::type const reference_type;
typedef typename boost::range_difference<Range>::type difference_type;
/// Constructor including the range it is based on
@@ -71,7 +74,7 @@ struct closing_iterator
private:
friend class boost::iterator_core_access;
inline typename boost::range_value<Range>::type const& dereference() const
inline reference_type dereference() const
{
return *m_iterator;
}

View File

@@ -100,7 +100,9 @@ struct ever_circling_range_iterator
<
ever_circling_range_iterator<Range>,
typename boost::range_value<Range>::type const,
boost::random_access_traversal_tag
boost::random_access_traversal_tag,
typename boost::range_reference<Range>::type const,
typename boost::range_difference<Range>::type
>
{
/// Constructor including the range it is based on
@@ -118,12 +120,13 @@ struct ever_circling_range_iterator
, m_index(0)
{}
typedef std::ptrdiff_t difference_type;
typedef typename boost::range_reference<Range>::type const reference_type;
typedef typename boost::range_difference<Range>::type difference_type;
private:
friend class boost::iterator_core_access;
inline typename boost::range_value<Range>::type const& dereference() const
inline reference_type dereference() const
{
return *m_iterator;
}