range-based for の declaration と expression の可視性について
先週、ようやく range-based for が gcc-4.6 に実装されました。めでたい。
さて range-based for ですが、規格によると
for ( for-range-declaration : expression ) statement
と
{ auto && __range = ( expression ); for ( auto __begin = begin-expr, __end = end-expr; __begin != __end; ++__begin ) { for-range-declaration = *__begin; statement } }
は "equivalent" であるとされています。この "equivalent" が曲者で、どのレベルでの話なのかが分からないのです。
現在の gcc-4.6 の実装は range-baased for がきたら、そのまま構文木のレベルで後者の物に置き換えています。-fdump-tree-original とかするとなんとなく雰囲気が掴めると思います。
ここで一つ問題が発生して、range-baseed for と置換後の for では、declaration と expression の位置関係が逆になっています。そのため、一見問題なさそうな下のようなコードは、コンパイルすることができません。
int main(){ for (int i : (decltype(i)[1]){ 0 }); }
うーん…どうなんだろう。
あと逆のパターンで、一見通りそうにないけれど…みたいなのもありそうなんですが、考えてないです。誰か思いついたら教えてください。
追記:declaration は expression に依存しているので、仕方ない気がしてきた。