提供的代码演示了尝试在常量表达式中利用 constexpr 函数 make_const 的返回值,但遇到错误。
static constexpr int make_const(const int i) { return i; } void t1(const int i) { constexpr int ii = make_const(i); // Error occurs here (i is not a constant expression) std::cout << ii; } int main() { t1(12); // Call the function }
与普遍看法相反,constexpr 函数不会神奇地使其参数在编译时评估。相反,它允许 constexprness 从其输入参数传播到其输出。然而,在给定的代码中,函数参数 i 不是 constexpr,因此 constexpr 函数 make_const 无法将其转换为 constexpr。
出现错误是因为后续赋值 constexpr int ii = make_const(i) 尝试声明一个 constexpr 变量 (ii),并使用非 constexpr 表达式 (make_const(i)) 的结果进行初始化。这是不允许的,因为 constexpr 变量必须始终使用 constexpr 表达式进行初始化。
constexpr 函数具有两个关键特征:
要解决该错误,可以确保函数参数本身是 constexpr 。这可以通过将函数声明修改为:
constexpr int make_const(constexpr int i) { return i; }
此更改保证函数可以有效地将其 constexpr 输入转换为 constexpr 输出,从而能够在常量表达式中实现函数的预期用途。
在提供的替代代码示例中,函数 make_const 可以作为 t1 中的 constexpr 表达式进行调用,因为它的参数现在是 constexpr。但是,尝试将非 constexpr 表达式(例如运行时变量)的结果传递到函数中仍然会导致错误,因为该函数需要 constexpr 参数才能执行 constexpr。
以上是为什么我不能在常量表达式中使用 `constexpr` 函数的函数参数?的详细内容。更多信息请关注PHP中文网其他相关文章!