常量表达式是可以在编译时计算的表达式。 Constexpr 函数是如果使用 constexpr 参数调用则可以在编译时求值的函数。
在代码中,make_const 函数是一个 constexpr 函数。但是,t1 中的参数 i 不是 constexpr 参数,因为它没有指定为 const。
void t1(const int i) { constexpr int ii = make_const(i); // error: i is not a constant expression }
要解决此问题,可以通过将 i 的类型更改为 const int 使 i 成为常量参数,或者通过将 t1 定义为 constexpr 函数本身:
void t1(const int i) // const int i to make i a constant parameter { constexpr int ii = make_const(i); }
constexpr int t1(const int i) // constexpr t1 to make t1 a constexpr function { return make_const(i); }
使用 a 时会出现另一个问题模板函数中的 constexpr 函数旨在返回 constexpr 值。
template<int i> constexpr bool do_something(){ return i; } constexpr int t1(const int i) { return do_something<make_const(i)>(); // error: i is not a constant expression }
在这种情况下,编译器无法保证参数 i 是常量表达式,因为它取决于模板的值传递给 do_something 的参数。为了确保 t1 可以在编译时求值,模板参数 i 必须是常量表达式。
另一种方法是使用 std::variant 和 std::integral_constant 创建一个编译时常量,可以与运行时值结合使用。
template<auto I> using constant_t=std::integral_constant<decltype(I),I>; template<auto I> constexpr constant_t<I> constant_v={}; template<auto...Is> using var_enum_t=std::variant<constant_t<Is>...>;
这允许创建一个可以在运行时选择的编译时常量变体std::访问。
auto idx=var_index<5>(3/* 3 can be runtime */); std::visit([](auto three){ // three is a compile time value here }, idx);
以上是为什么不能在常量表达式中使用函数参数?的详细内容。更多信息请关注PHP中文网其他相关文章!