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

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

Patricia Arquette
发布: 2024-11-29 07:53:13
原创
597 人浏览过

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

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