首页 > 后端开发 > C++ > 为什么引用参数会导致 Constexpr 函数出错?

为什么引用参数会导致 Constexpr 函数出错?

Mary-Kate Olsen
发布: 2024-12-15 17:57:15
原创
931 人浏览过

Why Do Reference Parameters Cause Errors in Constexpr Functions?

Constexpr 函数中引用参数的混淆

下面的代码片段尝试在 constexpr 函数中将两个字节数组连接成一个新数组命名为 concatenate。

template <size_t S1, size_t S2>
auto concatenate(const std::array<uint8_t, S1> &data1,
                 const std::array<uint8_t, S2> &data2)
{
    std::array<uint8_t, data1.size() + data2.size()> result; // Error occurs here

    // ...
}
登录后复制

但是,当使用 Clang 编译时6.0 使用 C 17 标准时,会出现错误:“非类型模板参数不是常量表达式”。此错误源于函数参数(data1 和 data2)的引用性质。

函数参数中的引用类型会触发问题,因为常量表达式无法计算引用,如 C 标准中 [expr.1] 中所述。 const]/4:

“表达式 e 是核心常量表达式,除非 e... 的计算将计算引用引用类型的变量或数据成员的 id 表达式,除非引用具有前面的初始化。"

由于本例中的引用参数没有前面的初始化,因此它们不能在常量表达式中使用。

要纠正此问题,可以将代码修改为直接使用 S1 和 S2 模板参数,而不是依赖参考参数的 size() 成员函数:

std::array<uint8_t, S1 + S2> result;
登录后复制

以上是为什么引用参数会导致 Constexpr 函数出错?的详细内容。更多信息请关注PHP中文网其他相关文章!

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