编译器可以自己创建一些函数 constexpr 吗?

Can compiler make some function constexpr on its own?

编译器能否在编译时评估未标记为 constexpr 的函数,或者所有不带 constexpr 且非内联的函数将仅在运行时评估?

即使未标记为 constexpr,允许编译器在编译时评估某些函数,是的。例如:

int foo() {
    int result = 0;
    for (int i = 1; i <= 100; i++) result += i;
    return result;
}
const int s = foo();

编译器可以通过简单地给它赋值 5050 来优化 s 的初始化。

但是,编译器不允许您将 foo() 的结果用作模板参数(就好像您只是简单地编写了 5050),因为它不是有效的常量表达式。它必须发出诊断。

换句话说,constexpr 不控制函数是否可以在编译时求值。它控制是否允许在需要常量表达式的上下文中调用函数。