首页 > 后端开发 > C++ > 为什么我无法将非 Constexpr 参数传递给 Constexpr 函数?

为什么我无法将非 Constexpr 参数传递给 Constexpr 函数?

Susan Sarandon
发布: 2024-11-15 08:57:02
原创
606 人浏览过

Why Can't I Pass Non-Constexpr Arguments to a Constexpr Function?

常量表达式中 Constexpr 函数参数的限制

考虑代码片段:

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;
}
登录后复制

错误详细信息

尝试使用 make_const(i) 初始化 ii 时,代码会触发错误,因为 i 不是常量表达式。这是因为:

  • constexpr 变量是一个保证在编译时可用的值的变量。
  • constexpr 函数是一个在编译时计算的函数,当提供constexpr 参数。

将非 constexpr 参数传递给 constexpr 函数不会产生 constexpr 输出。但是,constexpr 函数可以继承和传播其输入参数的 constexprness。

允许的场景

以下代码可以工作,因为 t1() 和 make_const() 都是带有 constexpr 参数的 constexpr 函数:

constexpr int t1(const int i)
{
    return make_const(i);
}
登录后复制

限制

以下代码失败,因为 do_something() 不是 constexpr 函数,即使 make_const() 是:

template<int i>
constexpr bool do_something(){
    return i;
}

constexpr int t1(const int i)
{
    return do_something<make_const(i)>();   // error occurs here (i is not a constant expression)
}
登录后复制

结论

理解 constexpr 函数和变量之间的区别对于避免此类错误至关重要。 Constexpr 函数提供了在编译时和运行时评估的灵活性,但只能使用 constexpr 参数。

以上是为什么我无法将非 Constexpr 参数传递给 Constexpr 函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

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