rvalue references

Diggory diggsey at googlemail.com
Tue Apr 23 09:32:03 PDT 2013


> No it is not the only difference. "scope ref" (as proposed in 
> DIP35) is more restrictive in usage - can't take address of it, 
> can't return it, can't implicitly cast it to normal ref. It is 
> "scope" primarily and "rvalue ref solution" only secondarily.

With DIP25 these restrictions apply to "ref" as well (with the 
exception that you CAN return a "ref", but it turns out it would 
also be safe to return a "scope ref" in those circumstances).

> DIP25 imposes a number of code-breaking restrictions even in 
> @system code, if DIP36 was in place, one could consider 
> imposing the DIP25 restrictions only in SafeD.

Yes, the "addressof" part of DIP25 would cause problems, but the 
part to do with safety of "ref" will not. IMO we shouldn't start 
trying to add rvalue references until we've solved the safety of 
normal references. We should therefore split DIP25 into two parts:

- The part that guarantees safety of "ref" can be implemented 
right away (just make taking the address of a reference unsafe 
instead of adding "addressof"). There is simply no avoiding 
implementing something like this if you want safe references.

- The part to do with fixing syntactic ambiguities of &, adding 
"addressof" and making "ref" more restrictive can be a separate 
DIP. This is the one that would potentially break code.

If we do this first, the issue of rvalue references becomes a 
non-issue. Even without explicitly defining what the lifetime of 
an rvalue reference is it becomes safe to pass them as "ref":

- In DIP25 it is the caller who enforces the safety of "ref", the 
callee just has to follow the same simple rules.

- The caller will always know the lifetime of anything it passes 
in, so it is simple to ensure that it doesn't last beyond that.

> Furthermore if one day the compiler would be sufficiently smart 
> to infer scope automatically, there still would be an important 
> difference between 'ref' and 'scope ref'.

That's not what I'm saying, even with no inference on behalf of 
the compiler there is still no difference between "scope ref" and 
"ref".


More information about the Digitalmars-d mailing list