静态和动态模板初始化是否可以交错?

问题描述 投票:3回答:1

据我所知,给出以下代码:

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>的不同用途使用不同的初始化吗?程序可以完全返回其他值吗?

c++ initialization language-lawyer
1个回答
0
投票

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以外的任何东西。

© www.soinside.com 2019 - 2024. All rights reserved.