静态和动态模板初始化可以交错吗?
Can static and dynamic template initialization be interleaved?
据我了解,给定以下代码:
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之前排序时,评估A和B是不确定的顺序,但未指定哪个。[ 注意:不确定顺序的评估不能重叠,但可以先执行。 — 尾注 ]
所以在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 以外的任何东西。
相关文章:
- 内联映射初始化的动态atexit析构函数崩溃
- 动态初始化 C 与 C++ 中的静态值
- 哈希映射使用 nullptr c++ 初始化节点的动态数组
- 静态和动态模板初始化可以交错吗?
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- C++ - 使用类中的初始值设定项列表初始化动态集
- 异常 尝试初始化动态数组时未处理
- 如何使用initializer_ist在构造函数中初始化动态数组
- 如何在类中初始化动态数组
- 如何使用一些参数初始化动态分配的数组中的对象
- 初始化动态分配的数组时出错
- 使用对象的复制构造函数初始化动态数组对象
- 初始化动态数组
- 通过已存在的对象初始化动态分配的对象
- c++初始化动态内存中c样式字符串的默认值
- 如何在c++中以非标准方式初始化动态内存
- 初始化动态字符串数组(c++)
- 如何使用memset初始化动态二维数组
- 初始化动态向量列表
- 特征:逗号初始化动态矩阵