C++ 函数上的Constexpr

C++ 函数上的Constexpr,c++,function,constexpr,factorial,C++,Function,Constexpr,Factorial,我刚刚了解到,如果我使用编译时已知的值调用constepr函数,编译器将用最终结果替换该函数 那么,为什么在编译对函数的调用后,我会在运行时崩溃呢 constexpr unsigned long long factorial(unsigned long long n) { return n > 1 ? n * factorial(n - 1) : 1; } 例如,我认为您有一个整数溢出。对于factorial(50),代码运行良好,生成的结果非常接近std::numeric_li

我刚刚了解到,如果我使用编译时已知的值调用
constepr
函数,编译器将用最终结果替换该函数

那么,为什么在编译对函数的调用后,我会在运行时崩溃呢

constexpr unsigned long long factorial(unsigned long long n)
{
    return n > 1 ? n * factorial(n - 1) : 1;
}

例如,我认为您有一个整数溢出。对于factorial(50),代码运行良好,生成的结果非常接近std::numeric_limits::max(),是否启用了优化?使用gcc和clang进行的快速测试表明,除非启用优化,否则它们不会评估您的功能。对于优化,它们都只返回0,这可能是因为其中一个溢出结果等于
0
使所有进一步的结果为0TL;复制副本的灾难恢复:
constexpr
意味着可以在编译时运行,而不是必须运行。若要强制使用它,请在常量表达式中使用它,编译器将被迫在编译时使用它。@mutableVoid我故意这样做是为了显示它在编译时崩溃的事实runtime@Foxel如果要强制在编译时对其求值,则选择“是”。C++20引入了
consteval
,它类似于
constexpr
,但保证只在编译时调用,如果您不想强制调用它,就可以使用它。
std::cout << factorial(10000);