这个问题通常是由以下原因所引起的:常量表达式初始化中的值不是字面常量而是通过函数调用生成的值。只有在编译时确定的值才能用作常量表达式初始化。对于这种情况,可以将调用的函数标记为constexpr。
例如:
constexpr int add(int x, int y) {
return x + y;
}
int main() {
constexpr int params = add(2, 3); // 编译器会报错
return 0;
}
在这个例子中,我们尝试将add函数的返回值赋给params,但编译器会报错,因为add不是constexpr函数。要解决这个问题,我们需要将add函数标记为constexpr,如下所示:
constexpr int add(int x, int y) {
return x + y;
}
int main() {
constexpr int params = add(2, 3); // 编译器不再报错
return 0;
}
现在,编译器不再报错,因为add默认为constexpr函数,它可以在编译时求值,从而允许将其返回值用作常量表达式的初始化值。