...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

構造体クイズ(2)

構造体クイズ1のときにはstatic opCallを含めていたのですが,もうこの仕様はないと考えていいのでそれなしで試してみました.
ちょうど,一時構造体のデストラクトが行われないバグが修正されたことですし.

import std.stdio;
struct X
{
	this(int i){writeln("X.this(int)");}
	this(this){writeln("X.postblit");}
	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");}
	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();
	{
		writeln("-2-");
		Y a = Y();
	}
	writeln();
	{
		writeln("-3-");
		Y a = 1;
	}
	writeln();
	{
		writeln("-4-");
		Y a = Y(1);
	}
	writeln();
	{
		writeln("-5-");
		Y a, b;
		a = b;
	}
	writeln();
	{
		writeln("-6-");
		Y a;
		a = X(1);
	}
	writeln();
	{
		//Y a = X(); // not compilable
		//Y a = X(1) // not compilable
	}
}

実行結果はこうなりました.

-1-
Y.~this

-2-
Y.~this

-3-
Y.this(int)
Y.~this

-4-
Y.this(int)
Y.~this

-5-
Y.postblit
Y.opAssign(Y)
Y.~this
Y.~this
Y.~this

-6-
X.this(int)
Y.opAssign(X)
X.~this
Y.~this

1と2が同じ,3と4が同じ.
あれ? こんなにシンプルだったっけ? って思うくらいになってます.
でも5で3回デストラクトされているのは何だろう?