带有引用参数的 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中文网其他相关文章!