Is there any reason to use non-ref foreach?

Dukc ajieskola at gmail.com
Fri Aug 31 09:59:20 UTC 2018


For me, it seems that for generality you should always add ref 
into foreach loop variable. The reason is this:

import std.experimental.all;

struct NoCopies
{   @disable this(this);
     int payload;
}

void main()
{   auto range = new NoCopies[20];
     foreach(const ref el; range) el.payload.writeln;
}

Without ref qualifier in el, this won't work because it would 
make a copy. Unlike ref as a function argument, it does not 
enforce refness:

import std.experimental.all;

void main()
{   auto range = iota(20).map!(x => x + 2);
     foreach(const ref el; range) el.writeln;
}

This compiles, even though range elements are rvalues.

This seems to imply, for me, that for generality one should 
always use ref in foreach loop variables. If the vairable has to 
be guarded against changes, it should const ref, not unqualified.

But considering unqualified is the default, I am probably missing 
something here. Performance?


More information about the Digitalmars-d-learn mailing list