autoな変数の型は、代入の式になる。そう言ってしまうのは、単なる一ユーザーである。いやしくもプログラミング言語学者(language lawyer)を自負している以上、auto指定子が、どうやって初期化子の式から、変数の型を推定するのかということを、厳密に知らなければならない。
実際、以下のコードをみれば、「変数の型は初期化の式になる」というのが、不完全な説明であるのは理解できるだろう。
int const a = 0 ; // aの型はint const auto b = a ; // bの型はint auto const c = a ; // cの型はint const auto const & d = a ; // dの型はint const &
しかし、この型の推定方法は、何かに似ている。そう、まるでテンプレートの実引数の型を推定しているようだ。まさにその通りである。auto指定子によって宣言された変数の型は、初期化子の式から、テンプレートの実引数推定と同じルールを用いて、推定しているのである。
つまり、
auto const & c = a ;
上記の文における変数の型とは、
template < class U > void f( U const & u ) ;
という関数テンプレートに対し、f(a)という呼び出しをした場合に推定される、テンプレート仮引数Uの型に等しい。
ところで、ひとつだけ例外がある。auto指定子は、初期化リストも型推定できる。
auto a = { 1, 2, 3 } ; // aの型は、std::initializer_list<int> auto b = { 1.0, 2.0, 3.0 } ; // bの型は、std::initializer_list<double> auto c = { 1, 2.0 } ; // エラー、型が推定できない
No comments:
Post a Comment