ホームに戻る
出典 :
型推論 - Wikipedia 通常関数の戻り値型推論 - cpprefjp C++日本語リファレンス auto - cpprefjp C++日本語リファレンス C++11 型推論(auto, decltype)の徹底活用 | プログラマーズ雑記帳
関連 :
C++11 型キャスト ジェネリックプログラミング コンテナ イテレータ
目次 :

型推論とは

静的な型付けを持つ言語において、変数や関数シグネチャの型を明示的に宣言しなくても、周辺情報および文脈などから自動的(暗黙的)に各々の型を決定する機構のこと。
初期化のための代入式の右辺値や、関数呼び出し時の実引数などから、変数や関数の戻り値の型を帰納的に決定することができる。
特にテンプレートやメタプログラミングでは、オブジェクトの型を実装時に特定することが困難(または不可能)であるため、型推論によって最適な型を割り当てることで省力化やヒューマンエラー低減が期待できる。
Java、C#、Swiftなどモダン言語が型推論をサポートしており、C++にはC++11から導入された。

C++における型推論

auto キーワードによる型推論

auto someStrangeCallableType = boost::bind(&SomeFunction, _2, _1, someObject); auto otherVariable = 5;
明示的に初期化される変数の宣言に auto キーワードを用いると、初期化子によって変数の型が特定される。
上記の変数 someStrangeCallableType の型は、関数テンプレート boost::bind() がその引数に応じて返す戻り値の型であり、
これはコンパイラは容易に判断できても、プログラマが調べるのは困難または不可能である。
このように型の特定が難しい場合でも auto を用いることで、自動的に変数や戻り値の型を決定できる。
また、同様に auto を用いた変数 otherVariable の型はリテラル(5)によって int となる。

auto はコードの簡略化(冗長性の排除)にも有効である。
// std::vector<int> myvec (ベクトル)を走査する場合 // auto を使用しない for ループ for (std::vector<int>::const_iterator itr = myvec.begin(); itr != myvec.end(); ++itr) { : } // auto を使用した for ループ // myvec.begin() がイテレータを返すことから、itr がイテレータであることは明白 for (auto itr = myvec.begin(); itr != myvec.end(); ++itr) { : }
myvec.begin() の戻り値の型からイテレータ itr の型を推論することができる。
コンテナがネストするような場合は特に効果が大きい。イテレータについては、リンク先を参照のこと。

decltype キーワードによる型の取得

decltype キーワードを用いると、オペランドで指定した式の型をコンパイル時に取得することができる。
int someInt; decltype(someInt) otherIntegerVariable = 5; //< decltype() のオペランド (someInt) により int 型と確定
auto で宣言した変数の(実際の)型はコンパイラにしかわからないので decltype と組み合わせることは有用である
(この例では、変数 someInt が int 型であるため、変数 otherIntegerVariable は decltype(someInt) の評価結果から int 型となる。)