C 变量模板.这是UB

C++ Variable Template. This is UB?

本文关键字:这是 UB 变量      更新时间:2023-10-16

我创建了一个简单的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>());
}