On 02/27/2014 10:09 PM, Ben Jones wrote:
My question is: which features of the D range abstraction allow zip to
work the way we expect?
Assignable elements of a range do not need to be addressable.
What C++isms were left behind to make this work?
In C++, iterators should implement operator-> which must return a
pointer to data, and unary operator*, which should return a reference
if it is to be assignable. This makes the iterator abstraction less
flexible.
I.e. it is a consequence of
- desire to use pointer-like syntax for iterators
- weak support for hooking into the corresponding syntactic constructs
Phobos eg. allows retrieval of and assignment to a range's front element
to be implemented in distinct methods that can execute arbitrary code.
Zip uses such facilities to distribute assignments to its range elements
back to each source range.