C 变量模板.这是UB
C++ Variable Template. This is UB?
我创建了一个简单的C 14变量模板,该模板计算阶乘(仅用于学习(。然后我要打印前12个阶乘。
template <int n> const int fact = n * fact<n - 1>;
template <> const int fact<0> = 1;
如果我将fact<12>
用fact<i>
替换为以下摘要,则会出现错误,因为i
不是恒定的。
int main()
{
for(int i = 0; i < 12; i++){
std::cout << fact<12> << std::endl;
}
}
但是,当我将其更改为此时,我会得到预期的结果。
int main()
{
for(int i = 0; i < 12; i++){
std::cout << *(&fact<12> - i) << std::endl;
}
}
这是不确定的行为吗?它在GCC 8.3上的预期工作。在这里实时示例
它是ub。您的指针算术"偶然起作用"(有任何事情都可能发生(。
您可以做,例如:
template <std::size_t ... Is>
void print_fact(std::index_sequence<Is...>)
{
for (int res : {fact<Is>...}) {
std::cout << res << std::endl;
}
}
int main()
{
print_fact(std::make_index_sequence<12>());
}
相关文章:
- 使用递归的数组的最小值.这是怎么回事
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- 这是实现图形的坏方法吗
- 当基类是依赖类型时,这是一个缺陷吗
- 当C++中需要自动删除时,这是静态的正确用法吗?
- 这是关于成员访问规则的正确摘要吗
- 这是插入排序的正确实现吗?
- 我使用 OpenMP 的线程越多,执行时间就越长,这是怎么回事?
- 如何在OpenCV中检测这是谁的脸?
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- 在 Python 和 c++ 2d 数组初始化之间.这是怎麽?为什么呢?
- 验证openssl c++中的签名,这是由JAVA DSA签名的?
- 这是GoogleTest AssertionResult中的错误吗?
- 在编译时,C++项目抛出错误 C2228,这是预期的,因为控件在运行时未达到该点
- 这是 basic.def.odr 部分的缺陷吗?
- 通过reinterpret_casting方法指针从指针调用派生类的方法。这是 UB 吗?
- 泛型方法指针.reinterpret_cast指向不同类的方法指针,这是 UB 吗?
- C 变量模板.这是UB
- reinterpret_cast无符号字符* 作为 uint64_t* - 这是 UB