Constexpr 函数和常量表达式中的引用参数
在 C 中,常量表达式是在编译时计算为常量值的表达式 -时间。考虑以下 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; // Possible error here return result; }
使用 Clang 6.0 和 -std=c 17 编译此函数时,由于在运行时评估 data1.size() 表达式,因此无法编译。仅当参数为引用时才会出现此错误,这表明对 constexpr 函数中引用参数的行为存在潜在误解。
根据 C 标准 ([expr.const]/4),表达式是核心常量表达式,如果其求值不涉及求值引用类型的变量或数据成员的 id 表达式,除非它具有可在常量表达式中使用的前置初始化,或者其生命周期在核心常量的求值中开始表达式。
在给定的函数中,引用参数没有预先初始化,导致它们的 size() 表达式非恒定。因此,它们不能在常量表达式中使用,从而导致编译错误。
要解决该问题并在常量表达式中使用引用参数,只需提供前面的初始化或替换 data1.size( ) 和模板参数 S1。
以上是可以在常量表达式的 C Constexpr 函数中使用引用参数吗?的详细内容。更多信息请关注PHP中文网其他相关文章!