为什么比较 constexpr 函数的两个参数不是静态断言的常量条件

Why is comparing two parameters of a constexpr function not a constant condition for static assertion?

本文关键字:参数 静态 两个 常量 断言 条件 constexpr 比较 函数 为什么      更新时间:2023-10-16
constexpr uint32_t BitPositionToMask(int i,int Size){
static_assert(i < Size,"bit position out of range");
return 1 << i;
}

这将生成:

error: non-constant condition for static assertion

在 GCC 4.6.2 上,我没有得到什么还是这是一个 GCC 错误?

constexpr函数

也可以使用运行时计算的参数来调用(在这种情况下,它就像任何常规函数一样被执行(。例如,请参阅此实时示例

另一方面,static_assert()严格要求其条件是可以在编译时计算的常量表达式。

这个答案是由odinthenerd发布的(在CC BY-SA 3.0许可证下(,作为对为什么比较constexpr函数的两个参数不是静态断言的恒定条件?的问题的编辑。转贴在这里以符合网站的问答格式。

<小时 />

如果这些值在编译时已知,则可以将它们作为模板参数传递,并且按预期工作。

template<int i,int Size>
constexpr uint32_t BitPositionToMask() {
  static_assert(i < Size,"bit position out of range");
  return 1 << i;
}