Double meaning of "auto"


まずコード

import std.string;
import std.cstream;
import std.windows.charset;

char[] _TEXT(char[] s) { return std.string.toString(toMBSz(s)); }

class C {
	private char[] value;
	this(char[] value) { this.value = value.dup; }
	~this() { dout.writeLine(value); }
}

void main() {
	{
		auto C c = new C("RAII");
	}
	{
		auto c = new C(_TEXT("暗黙の型推論"));
	}
	dout.writeLine("End of main");
}

...
C:\d\test>dmd -run auto
RAII
End of main
暗黙の型推論

何が言いたいかお解かりですね。


で思いついたのが、

	{
		auto auto c = new C(_TEXT("RAII & 暗黙の型推論"));
	}

と書けばどうかっちゅうこと。

C:\d\test>dmd -run auto
auto.d(21): redundant storage class 'auto'

くそ。

	{
		alias auto C CC;
		auto c = new CC(_TEXT("RAII & 暗黙の型推論"));
	}

こう書くとコンパイルは通ったけど

C:\d\test>dmd -run auto
RAII
End of main
RAII & 暗黙の型推論
暗黙の型推論

RAII は実行されてないみたい。

	{
		auto c = new auto C(_TEXT("RAII & 暗黙の型推論"));
	}

これもコンパイルが通らない。


両方やりたければ、class の宣言の方で auto をつければいいと思ったが、

auto class C {
	private char[] value;
	this(char[] value) { this.value = value.dup; }
	~this() { dout.writeLine(value); }
}

void main() {
	{
		auto C c = new C("RAII");
	}
	{
		auto c = new C(_TEXT("暗黙の型推論"));
	}
	{
		auto c = new C(_TEXT("RAII & 暗黙の型推論"));
	}
	dout.writeLine("End of main");
}
C:\d\test>dmd -run auto
auto.d(18): variable auto.main.c reference to auto class must be auto
auto.d(21): variable auto.main.c reference to auto class must be auto

auto な class は RAII の auto 変数でないと、宣言できなかった。
両立はムリのようです。

宣言 - プログラミング言語 D (日本語訳)
ここに

Initializer に前方参照を含むことはできません (この制限は将来的に取り除かれる予定です)。 暗黙に推論される型は、 実行時ではなくコンパイル時に静的に決まります。 クラス参照に対する暗黙の型推論は、 たとえauto記憶クラスが使用されていたとしても、auto宣言にはなりません:

こう書いてありました。

だいたい、キーワードを書かなければいけないのなら全然「暗黙」じゃないと思うんすが。