我创建了一个简单的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上按预期工作。 Live example here
答案 0 :(得分:3)
是UB。您的指针算术“偶然地起作用”(对于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>());
}