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 変数でないと、宣言できなかった。
両立はムリのようです。
Initializer に前方参照を含むことはできません (この制限は将来的に取り除かれる予定です)。 暗黙に推論される型は、 実行時ではなくコンパイル時に静的に決まります。 クラス参照に対する暗黙の型推論は、 たとえauto記憶クラスが使用されていたとしても、auto宣言にはなりません:
こう書いてありました。
だいたい、キーワードを書かなければいけないのなら全然「暗黙」じゃないと思うんすが。