函数的参数consteval
是:
- 在编译时就知道了
- 但不是 constexpr
Andrew Sutton 在他的论文翻译和评估:编译时元编程的心理模型中解释了这种行为背后的动机,正如这篇 SO 帖子所指出的那样。
您可以从consteval
函数返回参数并将其用作constexpr
:
consteval int foo(int n) {
return n;
}
constexpr int i = foo(9);
但是你不能constexpr
在函数内部使用它consteval
:
// fails to compile
consteval int abs(int n) {
if constexpr (n < 0) {
return -n;
}
else {
return n;
}
}
上面无法编译,因为n不是a 。constexpr
您当然可以使用一个简单的 if,它将在编译时进行评估:
// compiles
consteval int abs(int n) {
if (n < 0) {
return -n;
}
else {
return n;
}
}
constexpr int i = -9;
constexpr int num = abs(i);
这是一个术语问题:
是否有一个在编译时已知但不是常量表达式的常用名称?