昨日の続きです。いつも最長一致探索でうまくいくかというと、それでは困る場合もあります。

C++03までの有名な話ですが、次のようには書けません。

std::vector<std::vector<int>> v;

C++では>>も区切り子だからで、int>> vが「int」、「>>」、「v」という字句の並びと解釈されるのです。

そのため現状では次のように空白を入れればなりません。

std::vector<std::vector<int> > v;

あるいは、次のようにテンプレートの<>の内側には常に空白を入れる書き方も見受けられます。

std::vector< std::vector< int > > v;

C++で、現状の構文を大幅に変えることなく、テンプレート引数での>>を許すとしたら、現実的には字句解析の際に、文脈に応じて>>を2つ>のの並びに解釈してやることになると思います。そう考えると、それは美しくないから現状でもいいように私は思えたのですから不思議です。

ところで、C#やJavaはここらへんどうなっているのでしょう。C# 2.0は>>が可能だったと思いますが。


2013年5月4日追記:C++11ではstd::vector<std::vector<int>>と書けるようになりました。参考:テンプレートの閉じ括弧が右シフト演算子に誤認される問題、ほかだとどうなの? | イグトランスの頭の中(のかけら)

スポンサード リンク

この記事のカテゴリ

  • ⇒ 構文定義 (8) 字句に固められる文法
  • ⇒ 構文定義 (8) 字句に固められる文法