On Friday, 20 September 2013 at 09:36:18 UTC, andrea9940 wrote:
Running this code I would expect to get "ref" three times, but ...

-------
import std.stdio;
struct A {
        int[128] data;
        ref A opAdd(const ref A a) {
                A cp = this;
                cp.data[] += a.data[];
                return cp;
        }
}

void fun(A a) { writeln("copy"); }
void fun(const ref A a) { writeln("ref"); }

void main() {
        A a, b;
        fun(a + b); //prints "copy"
        fun(A());   //prints "copy"
        fun(a);     //prints "copy"
This prints 'ref' if you change func(A a) to func(const A a) the match of const ref isn't prefered over A a because const need an implicit conversion.
}
-------

After some tests I concluded that is not possible to pass the result of a+b as a reference (which is what interests me most) and this creates an evident performance problem.
Is there any solution that I missed ?

a + b is an rvalue and will moved to func(A a). This is even faster than ref. ;)
A() is also moved.
If you have two functions, one with const A a and one with ref const A a, the latter accepts lvalues which are passed by ref and the first accepts rvalues which are moved. So no performance problem. ;) If you're function is a template you can use 'auto ref' which automatically generate two versions of your function: one with and one without ref.

Reply via email to