首页 > 后端开发 > C++ > 如何解决带引用的 Constexpr 函数中的'非类型模板参数不是常量表达式”错误?

如何解决带引用的 Constexpr 函数中的'非类型模板参数不是常量表达式”错误?

Linda Hamilton
发布: 2024-12-04 02:30:09
原创
556 人浏览过

How Can I Resolve

在 Constexpr 函数中引用非常量参数

考虑以下函数模板:

template <size_t S1, size_t S2>
auto concatenate(const std::array<uint8_t, S1>& data1,
                 const std::array<uint8_t, S2>& data2)
{
    // Error in constexpr contexts due to reference parameter
    std::array<uint8_t, data1.size() + data2.size()> result;

    // ...
}
登录后复制

使用 Clang 6.0对于 C 17,此代码无法编译,并出现错误“non-type模板参数不是常量表达式。”由于潜在的别名问题,评估 constexpr 函数中的引用会出现问题。

了解标准

根据 C 标准 ([expr.const]/4),如果表达式计算结果为以下引用,则它不能是核心常量表达式:

  • 不有一个预先的初始化
  • 在常量表达式求值之前创建

解决方案

要解决此问题,可以替换有问题的引用参数及其对应的模板参数:

template <size_t S1, size_t S2>
auto concatenate(const std::array<uint8_t, S1>& data1,
                 const std::array<uint8_t, S2>& data2)
{
    // Problem solved by using S1 + S2 instead
    std::array<uint8_t, S1 + S2> result;

    // ...
}
登录后复制

通过直接使用模板参数,我们无需评估 constexpr 上下文中的引用并确保该函数可用于常量表达式评估。

以上是如何解决带引用的 Constexpr 函数中的'非类型模板参数不是常量表达式”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

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