DMD Bug or not? foreach over struct range
Jonathan M Davis
jmdavisProg at gmx.com
Wed May 16 00:03:48 PDT 2012
On Wednesday, May 16, 2012 02:43:19 Nick Sabalausky wrote:
> This code:
>
> ------------------------------------------
> import std.stdio;
>
> struct Foo
> {
> int val;
>
> @property bool empty() {
> return val >= 5;
> }
>
> @property int front() {
> return val;
> }
>
> void popFront() {
> val++;
> }
> }
>
> void main()
> {
> Foo foo;
> foreach(val; foo)
> writeln(foo.val, " ", val);
> }
>
> ------------------------------------------
>
> Expected output:
> 0 0
> 1 1
> 2 2
> 3 3
> 4 4
>
> Actual output:
> 0 0
> 0 1
> 0 2
> 0 3
> 0 4
>
> It seems that foreach is iterating over an implicit copy of 'foo' instead of
> 'foo' itself. Is this correct behavior, or a DMD bug?
No. That's expected. Your range is a value type, so it got copied when you
used it with foreach. Otherwise, if you did
Foo foo
foreach(val; foo)
{}
assert(foo.empty);
that assertion would pass, but it doesn't, and it shouldn't. If your range was
a reference type (e.g. if it were a class or it was like the ranges in
std.stdio which deal with I/O), then using it with foreach would consume it,
but that won't happen with a value type range.
- Jonathan M Davis
More information about the Digitalmars-d-learn
mailing list