C ++编译器可以缓存constexpr函数的结果吗?

时间:2017-04-01 21:42:12

标签: c++ c++11 templates constexpr

免责声明:这个问题有点复杂,因为它有几个问题,但它们都与相同的概念/问题有关。

前提: consexpr个函数可能只包含一个return语句。

他们可以调用其他函数并使用条件,但理论上它们应该证明函数的纯度,因此结果应该可以在某种映射中由编译器(在编译时)编译,以便编译器不必不断重新评估相同的功能。

问题(S): 这个假设是正确的还是我没有考虑过的东西会导致无法缓存constexpr函数的结果? 如果不是,这是否意味着每次使用时都必须计算constexpr个函数?

template怎么样? constexpr上的template值是否可以缓存,还是每次都必须重新计算?

1 个答案:

答案 0 :(得分:1)

我不认为constexpr函数必须是纯粹的 - 至少不是所有可能的参数。考虑:

#include <iostream>
#include <stdlib.h>

constexpr int f(int n) { return n == 0 ? 42 : rand(); }

template <int n> void g() {}

int main()
{
    g<f(0)>();  // OK
//    g<f(1)>();  // error
    std::cout << f(0) << ' ' << f(1) << ' ' << f(2);
}

输出:42 1804289383 846930886Demo