shared_ptrを作ってみようと頑張っていたのですが・・・.
import std.stdio; struct X { this(int i){writeln("X.this(int)");} this(this){writeln("X.postblit");} static X opCall(X){writeln("X.opCall(X)");X x;return x;} static X opCall(Y){writeln("X.opCall(Y)");X x;return x;} static X opCall(int){writeln("X.opCall(int)");X x;return x;} static X opCall(){writeln("X.opCall()");X x;return x;} ref X opAssign(X){writeln("X.opAssign(X)");return this;} ref X opAssign(Y){writeln("X.opAssign(Y)");return this;} ~this(){writeln("X.~this");} } struct Y { this(int i){writeln("Y.this(int)");} this(this){writeln("Y.postblit");} static Y opCall(Y){writeln("Y.opCall(Y)");Y y;return y;} static Y opCall(X){writeln("Y.opCall(X)");Y y;return y;} static Y opCall(int){writeln("Y.opCall(int)");Y y;return y;} static Y opCall(){writeln("Y.opCall()");Y y;return y;} ref Y opAssign(Y){writeln("Y.opAssign(Y)");return this;} ref Y opAssign(X){writeln("Y.opAssign(X)");return this;} ~this(){writeln("Y.~this");} } void main() { { writeln("-1-"); Y a; }{ writeln("\n-2-"); Y a = Y(); }{ writeln("\n-3-"); Y a = Y(1); }{ writeln("\n-4-"); Y a, b; a = b; }{ writeln("\n-5-"); Y a = X(); }{ writeln("\n-6-"); Y a = X(1); }{ writeln("\n-7-"); Y a; a = X(1); } }
-1- Y.~this -2- Y.opCall() Y.postblit Y.~this Y.~this -3- Y.this(int) Y.~this -4- Y.postblit Y.opAssign(Y) Y.~this Y.~this Y.~this -5- X.opCall() X.postblit X.~this Y.opCall(X) Y.postblit Y.~this X.~this Y.~this -6- X.this(int) Y.opCall(X) Y.postblit Y.~this X.~this Y.~this -7- X.this(int) Y.opAssign(X) X.~this Y.~this
カオス・・・.
さらにtemplateになったらわけわかりません.
あと
opDotとalias thisがあった・・・.