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