autoおよびtypeofキーワード

auto

前の章でFile変数を定義したとき、=演算子の両側に型名を繰り返した。

File file = File("student_records", "w");
D

これは冗長に感じる。また、型名が長い場合、面倒で、特にエラーが発生しやすくなる。

VeryLongTypeName var = VeryLongTypeName(/* ... */);
D

幸い、コンパイラは右辺の式から左辺の型を推測できるため、左辺の型名は不要だ。コンパイラが型を推測できるように、キーワードautoを使用することができる。

auto var = VeryLongTypeName(/* ... */);
JavaScript

autoは、右側に型が明示されていなくても、あらゆる型に使用できる。

auto duration = 42;
auto distance = 1.2;
auto greeting = "Hello";
auto vehicle = BeautifulBicycle("blue");
D

"auto"は自動の略語だが、自動型推論から来ているわけではない。これは、変数の寿命に関する概念である自動格納クラスから来ている。autoは、他の指定子が適切でない場合に使用する。例えば、次の定義ではautoを使用していない。

immutable i = 42;
D

コンパイラは、iの型を上記のimmutable intと推論する。(immutableについては、後の章で説明する。)

typeof

typeofは、式(単一の変数、オブジェクト、リテラルなど)を実際に評価することなく、その式の型を指定する。

以下は、typeofを使用して、型を明示的に記述せずに指定する方法の例である。

int value = 100;      // すでに'int'として定義されている

typeof(value) value2; // "値の型"を意味する
typeof(100) value3;   // "リテラル100の型"を意味する
D

上記の最後の2つの変数定義は、以下のものと同等だ:

int value2;
int value3;
D

実際の型がわかっている上記のような状況では、typeofは明らかに必要ない。代わりに、変数の型を、型が変化する可能性のある他のコードと一致させたい、より複雑なシナリオで、通常はこのキーワードを使う。このキーワードは、後の章で説明するテンプレートミックスインで特に役立つ。

演習

これまで見てきたように、100のようなリテラルの型はintである(shortlong、その他の型とは異なる)。1.2のような浮動小数点リテラルの型を判別するプログラムを書いてみよう。このプログラムでは、typeof.stringofが役立つだろう。