首页 >后端开发 >C++ >为什么 `data1.size()` 不能在带有引用参数的 `constexpr` 函数中工作?

为什么 `data1.size()` 不能在带有引用参数的 `constexpr` 函数中工作?

Patricia Arquette
Patricia Arquette原创
2024-11-29 07:53:13647浏览

Why Doesn't `data1.size()` Work in a `constexpr` Function with Reference Parameters?

带有引用参数的 Constexpr 函数中的常量表达式

考虑以下代码片段:

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: non-type template argument is not a constant expression
    ...
}

当使用编译时clang 6.0 with -std=c 17,由于 size 成员,函数无法编译应用于引用时,数组的函数不是 constexpr。

标准原理

此行为的原因在 [expr.const]/4 中进行了解释C 标准:

  • 如果表达式计算的是引用引用类型的变量或数据成员的 id-表达式,除非:

    • 引用具有预先初始化并且可在常量表达式中使用
    • 引用的生命周期开始于表达式的计算

在这种情况下,参考参数data1没有预先初始化,因此不能在常量表达式 data1.size() data2.size() 中使用。

解决方案

要解决此问题,只需替换 data1.size( ) 与模板参数 S1:

std::array<uint8_t, S1 + S2> result;

以上是为什么 `data1.size()` 不能在带有引用参数的 `constexpr` 函数中工作?的详细内容。更多信息请关注PHP中文网其他相关文章!

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