首页 > 后端开发 > C++ > 正文

为什么不能在常量表达式中使用函数参数?

Patricia Arquette
发布: 2024-11-15 08:26:02
原创
999 人浏览过

Why Can't I Use Function Parameters in Constant Expressions?

为什么不能在常量表达式中使用函数参数?

常量表达式是可以在编译时计算的表达式。 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板