C++03とC++11以降のright shift operator互換性の問題
C++03まででは>>の記述は全てrigth shift operatorとコンパイラに解釈されていたため
template<class _Tp>struct X{}; X<X<int> >();
とテンプレートの入れ子記述を示すためにスペースを空けなければならなかったが、C++11以降は解釈を変更したためスペースなしでも通る。これは周知の事実であるが、C++03時代の記述が残っていると、C++11との互換性を損なう場合がある。
template<class _Tp>struct X{}; template<int N>struct Y{}; X<Y<1> >2> >(); // "expected unqualified-id before numeric constant" on gcc
上記の記述はC++03ではwell-formedだがC++11ではill-formedなコードである。因みにC++11に対応しているバージョン以降のGCCであればwarningを吐くようになっている。*1
warning: '>>' operator is treated as two right angle brackets in C++11 [-Wc++11-compat] X<Y<1>>2> >(); ^~ note: suggest parentheses around '>>' expression
実際に、この事例に直面したのでメモ書きとして残しておく。