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

Can static and dynamic template initialization be interleaved?

本文关键字:初始化 动态 静态      更新时间:2023-10-16

据我了解,给定以下代码:

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(。

以下是给出不同输出的不同编译器的比较(clang 返回 0,gcc 返回 4(。

问题是 - 这个程序可以返回 2 吗?

int main () { return i<2>; }

即在i<2>的初始化中,不同的初始化可以用于i<1>的不同用途吗?程序可以完全返回其他值吗?

您从使用变量模板的递归计算中了解到 - gcc 与 clang 的动态i<2>i<1>初始化是不确定的排序。不确定顺序的评估不能交错(重叠(:

当 A 在 B 之前排序或 B 在A之前排序时,评估AB不确定的顺序但未指定哪个。[ 注意:不确定顺序的评估不能重叠,但可以先执行。 — 尾注 ]

所以在int i<2> = i<1> + i<1>;的动态初始化中,i<1>的静态或动态值都用于两个求和,这取决于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 以外的任何东西。