以下代码给出了预期的编译器错误(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)
尚不可见 for 的特化。但是为什么也没有错误o2
,它看到了 2 个匹配的专业化!?
我的猜测是,编译器第一次遇到时应该选择Unique<3>::type
具有任意名称的 ,然后用Unique<3>::type
该名称替换任何地方。
这是编译错误还是 C++ 错误或 C++“功能”?