次のコードでは、予期されるコンパイラ エラーが発生します ( Demo )。
1 template<bool> struct Range;
2
3 template<int value, typename = Range<true> > struct Unique;
4 template<int value> struct Unique<value, Range<(value > 1)> > { typedef char type[1]; };
5 template<int value> struct Unique<value, Range<(value > 2)> > { typedef char type[2]; };
6
7 Unique<3>::type o1;
8 Unique<3>::type o2;
ここで、5 行目と 7 行目を入れ替えるとします。次に、コンパイラエラーはありません!! デモ。
5 Unique<3>::type o1;
7 template<int value> struct Unique<value, Range<(value > 2)> > { typedef char type[2]; };
の場合o1
、特殊化(value > 2)
がまだ表示されていないため、エラーがないことは理解できます。o2
しかし、 2 つの一致する特殊化が表示されるエラーが発生しないのはなぜですか!?
私の推測では、コンパイラは、Unique<3>::type
初めて遭遇したときに任意の名前を選択しUnique<3>::type
、その名前ですべてを置き換える必要があります。
これはコンパイルのバグですか、それとも C++ のバグですか、それとも C++ の「機能」ですか?