免责声明:这个问题有点复杂,因为它有几个问题,但它们都与相同的概念/问题有关。
前提:
consexpr
个函数可能只包含一个return
语句。
他们可以调用其他函数并使用条件,但理论上它们应该证明函数的纯度,因此结果应该可以在某种映射中由编译器(在编译时)编译,以便编译器不必不断重新评估相同的功能。
问题(S):
这个假设是正确的还是我没有考虑过的东西会导致无法缓存constexpr
函数的结果?
如果不是,这是否意味着每次使用时都必须计算constexpr
个函数?
template
怎么样? constexpr
上的template
值是否可以缓存,还是每次都必须重新计算?
答案 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 846930886
。 Demo