For the code below, S is never copied even though a version of the function resolving to void x.foo!(x.S).foo(x.S) is called. How is this possible? Is it an optimization? I figure if I call a function that takes its parameter by value, there should be a copy.

Thanks
Dan

--------------- Output -----------------
T: abc is ref
T: xyz is not ref
--------------- Code -----------------
import std.stdio;

struct S {
  char c[];
  this(this) {writeln("Copying S\n");}
}

void foo(T)(auto ref T t) {
writeln("T: ", t.c, (__traits(isRef, t) ? " is ref " : " is not ref "));
}

void main() {
  S s = { ['a','b','c'] };
  foo(s);
  foo(S(['x', 'y', 'z']));
}
--------------

nm -C x | ddmangle | grep foo
0000000000477ab4 W void x.foo!(x.S).foo(ref x.S)
00000000004783fc W void x.foo!(x.S).foo(x.S)

Reply via email to