2010-08-04

auto指定子の型の推定方法

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: