how is this array subtyping inside struct (bug?) possible?

mw mingwu at
Sun Aug 9 21:12:58 UTC 2020

On Sunday, 9 August 2020 at 20:30:35 UTC, Paul Backus wrote:

> Normally, that's not a problem, because writeln takes its 
> arguments by value, so any range you pass to it will be copied, 
> and only the copy will be consumed. However, because you've 
> made your `Filenames` class into an input range using `alias 
> this`, and classes are reference types, consuming a copy of the 
> range also consumes the original.

I also tried this:

   foreach (i; 0..3) {
     S* s1 = new S();
     *s1 = s0;
     writeln(s0.fns.array.length);  // *directly* access array

The output is:


I'm *directly* access the underlying array, so why its length 
changed to 0 after writeln?

So a plain array *is* also a range? I've thought (an array's) 
range is a *separate* struct (which wrap the original array). The 
wrapper range can be consumed, but the underlying array should 
stay the same.

I never seen it's mentioned in the doc:

More information about the Digitalmars-d mailing list