在 Constexpr 函数中引用非常量参数
考虑以下函数模板:
template <size_t S1, size_t S2> auto concatenate(const std::array<uint8_t, S1>& data1, const std::array<uint8_t, S2>& data2) { // Error in constexpr contexts due to reference parameter std::array<uint8_t, data1.size() + data2.size()> result; // ... }
使用 Clang 6.0对于 C 17,此代码无法编译,并出现错误“non-type模板参数不是常量表达式。”由于潜在的别名问题,评估 constexpr 函数中的引用会出现问题。
了解标准
根据 C 标准 ([expr.const]/4),如果表达式计算结果为以下引用,则它不能是核心常量表达式:
解决方案
要解决此问题,可以替换有问题的引用参数及其对应的模板参数:
template <size_t S1, size_t S2> auto concatenate(const std::array<uint8_t, S1>& data1, const std::array<uint8_t, S2>& data2) { // Problem solved by using S1 + S2 instead std::array<uint8_t, S1 + S2> result; // ... }
通过直接使用模板参数,我们无需评估 constexpr 上下文中的引用并确保该函数可用于常量表达式评估。
以上是如何解决带引用的 Constexpr 函数中的'非类型模板参数不是常量表达式”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!