Playing around with the Compiler Explorer, I can see that GCC can convert even slightly complex functions into constant values at compile time. For example:
int func2(int x, y)
{
    return x ^ y;
}
int func(int x, int y)
{
    int i,j;
    int k=0;
    for (i=0; i<x; i++)
        for (j=0; j<y; j++)
        {
            k += i*j + func2(i,j);
        }
        return k;
}
int main()
{
    int x;
    x = func(4, 7);
    return x;
}
Simply inserts the answer 216 into main's return value. Note that I didn't use the keyword constexpr here. The compiler worked it out itself.
However, according to a few web pages I've read about constexpr, its purpose is to inform the compiler that a compile-time optimisation is possible here, so that the compiler actually bothers to do the calculation at compile time, whereas without the keyword, it wouldn't.
According to this answer on Stackoverflow:
The primary usage of constexpr is to declare intent.
Question:
Does constexpr ever actually change the compiler's output, causing it to calculate something at compile time that it otherwise wouldn't?
 
    