typenameはいつ要るのか

たまたま以前のつぶやき見つけたので...
書かないと忘れそうなので...
Togetter使いたいのに使えないってか(ずっと前から)ログインできないので...

boost::result_of::type /* == int */ i = (&digit_to_int)('6') // ってtypenameつけないでいいのかな?

https://twitter.com/#!/tyru/status/93140176733347841

@tyru typenameが必要なのはその部分を構文解析する時点で変数名なのか型名なのかが分からない名前が出てくる場合だけ

https://twitter.com/#!/fadis_/status/93141104567926784

@fadis_ なるほど… この場合定数か型かわからないのでつけないとコンパイルエラーになるのであってますかね…?

https://twitter.com/#!/tyru/status/93141622933557248

@tyru この場合このコードを読む時点で確定していない型はないので、typenameは要らないと思います

https://twitter.com/#!/fadis_/status/93143000884060160

@fadis_ ぐぬぬ…そうですか… 確定してないというのは変数iの前だから型だろうと判断できるからってことですか…?

https://twitter.com/#!/tyru/status/93143818291003394

@tyru 関数の返り値の型は、そこに関数名を書いてエラーになっていない時点で確定しているので、boost::result_ofの実体はその場で即座に定まって、typeが型か変数かもその場で決定することができます

https://twitter.com/#!/fadis_/status/93145097843126274

@fadis_ あ、なるほど!よくわかりました。ありがとうございます!

https://twitter.com/#!/tyru/status/93146419359268864


というわけでboost::result_of::typeとかならtypenameつけないとマズいですが
boost::result_of::typeなら大丈夫ってことですね。
なんか当たり前ですが、まぁこの程度のC++力なので...