On 28 August 2014 22:35, Krzysztof Czainski <1czajnik@gmail.com> wrote:
2014-08-28 23:29 GMT+02:00 Robert Jones <robertgbjones@gmail.com>:

On 28 August 2014 22:22, Neil Groves <neil@grovescomputing.com> wrote:

The counting_range instance is a unnamed temporary,,,,

So the earlier lines are flawed too, just working by chance?

Yes, combinations of counting_range with reversed. But not because counting_range is a temporary.

You are completely right in this instance. I've seen too many functions return a collection by value and then be used as the left-most operand in a chain of range adaptors! This is not applicable here.
 

I think the problem is counting_iterator returns a reference to an int it owns. Iterators shouldn't do that. 

This is exactly what is causing the issue.
 

Iterators should either: 
- return a reference to something they don't own, or
- return by value.


Your logic for return type makes a lot of sense. Unfortunately there are conflated requirements upon the return type of dereference operations for the various iterator traversals. See http://www.boost.org/doc/libs/1_56_0/libs/multi_array/doc/iterator_categories.html. I imagine that this is why the counting_iterator is implemented to return a true reference.

This leaves us with rather a thorny problem, a counting_iterator can't have the dereference operator return by value and model the Bidirectional Iterator Concept. Therefore if counting_iterator were to return by value we wouldn't be allowed to reverse (if we constrained ourselves to the Standard iterator traversal categories). It might be that there is room for improvement while working with the Boost traversal tags rather than the iterator traversal tags.
 

Regards,
Kris

Thanks for pointing this out, I hadn't spotted this issue with the counting_iterator. After giving this some more thought I shall raise a ticket for Boost.Iterator.

Regards,
Neil Groves