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

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

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-15 17:57:15933浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn