
16
|
1 章 型推論
f({ 11, 23, 9 }); // T deduced as int, and initList's
// type is std::initializer_list<int>
T は int と、initList の型 は std::
initializer_list<int> と推論される
最終的に auto とテンプレートの型推論の唯一かつ実質的な差異は、auto が波括弧で囲んだ初期
化子が std::initializer_list を表すと想定するのに対し、テンプレートの型推論は想定しない
という点です。
auto の型推論では波括弧で囲んだ初期化子を特別扱いし、テンプレートではそうしないのはなぜ
だろうかと思う読者もいるかもしれません。著者も同感です。納得のいく説明を見つけられません。
しかし規則は規則であり、auto により変数を宣言し、波括弧で囲んだ初期化子を用いるならば、推
論される型は常に std::initializer_list になると覚えるほかありません。この動作は、特に初
期値を波括弧で囲む初期化の統一記法を採用する場合に、当然のこととして肝に銘じておく必要が
あります。従来から C++11 に多いプログラミング上の誤りに、別の型を宣言するつもりで、std::
initializer_list の変数を宣言してしまうというものがあります。初期化子を波括弧で囲むのは
どうしてもそうしなければならない場合に限るとしている開発者もいますが、その理由の