据我所知,给出以下代码:
template<int N>
int i = i<N - 1> + i<N - 1>; // primary variable template
template<> int i<0> = 1; // and explicit specialization
以下程序必须返回2:
int main () { return i<1>; }
但是此程序可以返回0或4:
int main () { return i<2>; }
因为评估i<2>
的实例给出:
int i<2> = i<1> + i<1>; // generated by the compiler
在这里,由于仅隐式地实例化了i<1>
,因此编译器可以使用i<1>
的静态初始化值0
,也可以使用动态初始化的值2
。
这里是comparison不同的编译器提供不同的输出(clang返回0,gcc返回4)。
问题是-该程序可以返回2吗?
int main () { return i<2>; }
即在i<2>
的初始化中,可以针对i<1>
的不同用途使用不同的初始化吗?程序可以完全返回其他值吗?
i<1>
的静态初始化值,为0
您从哪里得到0?您自己在该声明的上方说i<1>
必须为2。
因此,鉴于:i<0>
=1
和:i<1>
=i<0> + i<0>
=1 + 1
=2
和:i<2>
=i<1> + i<1>
然后:i<2>
=2 + 2
= 4
不能是4以外的任何东西。