为什么比较 constexpr 函数的两个参数不是静态断言的常量条件
Why is comparing two parameters of a constexpr function not a constant condition for static assertion?
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; }
相关文章:
- 将参数中的函数\类传递给静态库
- 将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序
- 为什么 std::bind 静态类型检查传递给函数的参数?
- 用作默认参数的静态成员会导致无法解析的外部
- 静态私有函数,模板化类型作为C++中的默认参数
- 具有不同参数列表的模板对象的模板静态映射
- 具有静态大小数组作为参数的泛型 lambda
- VS 2008 和 VS 2017 中静态参数的不同行为
- Qt C++:静态断言失败:信号和插槽参数不兼容
- 来自函数参数的 C++ 静态数组声明
- 没有参数的递归,也没有静态或全局变量
- 根据模板参数可以选择静态的类成员
- 错误:静态断言失败:std ::线程参数必须在转换为rvalues后不可行
- 使用非静态值作为函数中的默认参数
- 为什么静态常量字符 * const 变量在为左值时可绑定到右值引用参数
- 将非静态数据成员作为默认参数传递给方法
- 如何使用静态变量来记住上次传递的参数
- 将非静态函数作为参数传递时出错
- 将静态参数克隆到 std::fill 导致链接器失败
- 获取非静态方法参数计数