Who says you can't bind a temporary to ref, or: why do we need DIP1016 again?
Rubn
where at is.this
Sat Dec 22 16:41:54 UTC 2018
On Saturday, 22 December 2018 at 16:26:31 UTC, Atila Neves wrote:
> Fun times:
>
> ---------------
> void main() {
> Foo foo;
> takesRef(foo.create.i); // oops
> }
>
> struct Foo {
> int i;
> Foo create() {
> return Foo();
> }
> }
>
> void takesRef(ref int x) { }
> ---------------
>
> Even more fun with auto ref:
>
> https://issues.dlang.org/show_bug.cgi?id=19507
Per https://p0nce.github.io/d-idioms/
mixin template RvalueRef()
{
alias T = typeof(this); // typeof(this) get us the type we're
in
static assert (is(T == struct));
@nogc @safe
ref T byRef() pure nothrow return
{
return this;
}
}
struct A {
mixin RvalueRef;
}
void foo( ref A a );
foo( A().byRef ); // ok
The whole argument against 1016 is that if it were implemented
you couldn't distinguish between rvalues and lvalues. But that is
already the case, same with your example.
This code just adds a unneeded bloat, including the extra mixin
for boilerplate code:
void foo( ref Vector2 );
foo( (a + b * c).byRef );
Why can't we just do:
foo( a + b * c );
More information about the Digitalmars-d
mailing list