编译器可以自己创建一些函数 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
不控制函数是否可以在编译时求值。它控制是否允许在需要常量表达式的上下文中调用函数。
编译器能否在编译时评估未标记为 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
不控制函数是否可以在编译时求值。它控制是否允许在需要常量表达式的上下文中调用函数。