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.