Rokiのチラ裏

学生による学習のログ

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

実際に、この事例に直面したのでメモ書きとして残しておく。

*1:GCC HEAD 7.0.0にて-std=c++98を付与し動作確認をした