C ++变量模板。这是UB吗?

时间:2019-06-26 23:07:31

标签: c++ templates c++14

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

1 个答案:

答案 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>());
}