C++ Can C++;编译器是否缓存constexpr函数的结果?

C++ Can C++;编译器是否缓存constexpr函数的结果?,c++,c++11,templates,constexpr,C++,C++11,Templates,Constexpr,免责声明:这个问题有点复杂,因为它是一个问题中的几个问题,但它们都与相同的概念/问题相关 前提: consexpr函数只能由一条return语句组成 它们可以调用其他函数并使用条件,但理论上它们应该证明函数的纯度,因此结果应该可以在某种映射中进行计算(由编译器在编译时进行),这样编译器就不必不断地重新计算同一个函数 问题: 这个假设是正确的还是我没有考虑到有什么东西使得不可能缓存constepr函数的结果? 如果否,这是否意味着每次使用constexpr函数时都必须计算它们 那么template

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

前提:
consexpr
函数只能由一条
return
语句组成

它们可以调用其他函数并使用条件,但理论上它们应该证明函数的纯度,因此结果应该可以在某种映射中进行计算(由编译器在编译时进行),这样编译器就不必不断地重新计算同一个函数

问题:
这个假设是正确的还是我没有考虑到有什么东西使得不可能缓存
constepr
函数的结果?
如果否,这是否意味着每次使用
constexpr
函数时都必须计算它们


那么
template
s呢?
模板上的
constexpr
值是可计算的,还是每次都必须重新计算?

我不认为
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);
}
#包括
#包括
constexpr int f(int n){返回n==0?42:rand();}
模板void g(){}
int main()
{
g();//好的
//g();//错误

std::cout
consexpr
函数通常可以在编译时进行计算;这就是练习的重点。在这种情况下,可执行代码最终只得到计算函数调用结果的常量,而不是函数本身的代码。这是最终的缓存。或者你问编译器是否可以n在编译时优化多个评估?可能吧,但我不知道你为什么会在意。你为什么要在意?这对你的程序有什么影响?@n.m.这样用户就不允许仅仅基于兴趣提问吗?问题的根源是否总是有一些实实在在的生产问题?
constexpr
函数不要求是纯的。只要求函数至少有一组参数,可以在编译时对其求值(即使是这样,也不需要诊断)。除此之外,
constepr
函数可以抛出异常。请参阅,查找
constepr char操作符[]
在这里的示例中。简短的回答:当然。真实的回答:。这是一些非常奇怪的行为。我非常确定
rand
不是
constexpr
,所以我发现
constexpr
函数将其视为有效函数是非常奇怪的。@Pharap几乎没有要求constexpr函数只包含对其他函数的调用constexpr函数。