Rvalue references - The resolution

Martin Nowak code at dawg.eu
Sun May 26 13:21:00 PDT 2013


On 05/05/2013 12:30 AM, Walter Bright wrote:
 > On 5/4/2013 3:03 PM, deadalnix wrote:
 >>> Where you miss the point, is that these annotations may be omitted
 >>> (and they
 >>> are most of the time). When nothing is specified, the lifetime of the
 >>> returned
 >>> reference is considered to be the union of the lifetime of parameters
 >>> lifetime, which is what you want in 99% of cases.
 >>
 >> Note : We may also choose the lack of explicit lifetime means runtime
 >> check as
 >> proposed, instead of being an error.
 >
 > D omits the check when it can prove that the returned ref is not a ref
 > to one of the parameters that is local.

ref int foo(ref int a, ref int b);

It's a very nice observation that calling foo with only non-local 
references means that the returned reference is non-local too.
In a way this works like inout but with a safe default so
that no annotation is needed.

In fact it's also possible to know that these don't return a reference 
to their parameter.

ref double foo(ref int a);

Struct S {}
ref double foo(ref S a);

It can become somewhat complicated to check though.

Anyhow I think using flow-analysis to omit runtime checks is a nice 
approach.


More information about the Digitalmars-d mailing list