On Thursday, 29 March 2018 at 19:11:30 UTC, Dgame wrote:
Just to be sure it does not got los: You know that you can avoid the temp/copy if you add one method to your struct, yes?

----
import std.stdio;

struct Big {
    string name;
    float[1000] values;

    this(string name) {
        this.name = name;
    }

    @disable
    this(this);

    ref auto byRef() inout {
        return this;
    }
}

void foo(ref const Big b) {
    writeln(b.name);
}

void main() {
    Big b = Big("#1");
    foo(b);
    foo(Big("#2").byRef);
}
----

That works like a charm and avoids any need for rvalue references. Just add it as mixin template in Phobos or something like that.

Doesn't work with built-in types like float.

Just adds bloat for operators like opBinary if you want that to be ref.

foo((a.byRef + b.byRef * c.byRef).byRef)

// vs

foo(a + b * c);

It's kind of funny all this talk about allowing temporaries to bind to refs being messy, yet you can already bind a temporary to a ref in a messy way using that.


Reply via email to