ConstexPR模板功能的无限递归
Infinite recursion of constexpr template function
i用constexpr函数在C 中实现了FNV-1A,但我遇到了一个奇怪的问题。
此版本无问题而起作用:
template<size_t N>
static constexpr uint32_t fnv1a_internal(const char (&data)[N], size_t position, uint32_t state) {
return position >= N - 1 ? state : fnv1a_internal(data, position + 1, (state ^ data[position]) * 16777619UL);
}
template<size_t N>
static constexpr uint32_t fnv1a(const char (&data)[N]) {
return fnv1a_internal(data, 0, 2166136261UL);
}
但是,当我将位置作为const通用参数时,像这样
template<size_t N, size_t Position>
static constexpr uint32_t fnv1a_internal(const char (&data)[N], uint32_t state) {
return Position >= N - 1 ? state : fnv1a_internal<N, Position + 1>(data, (state ^ data[Position]) * 16777619UL);
}
template<size_t N>
static constexpr uint32_t fnv1a(const char (&data)[N]) {
return fnv1a_internal<N, 0>(data, 2166136261UL);
}
实例化后,它将无法与编译器进行编译,以抱怨功能超过递归极限。
该功能旨在与这样的字符串文字使用:
uint32_t hash = fnv1a("Hello world");
问题在哪里?
三元操作不避免模板实例化。
因此,当Position >= N - 1
时,您仍然实例化 fnv1a_internal<N, Position + 1>
instantiat fnv1a_internal<N, Position + 2>
等。
自C 17以来,您可以使用if constexpr
:
template<size_t N, size_t Position>
static constexpr uint32_t fnv1a_internal(const char (&data)[N], uint32_t state) {
if constexpr (Position >= N - 1) {
return state;
} else {
return fnv1a_internal<N, Position + 1>(data, (state ^ data[Position]) * 16777619UL);
}
}
相关文章:
- 交换运算符 + 重载会导致无限递归
- 为什么当函数参数未定义为常量引用时存在无限递归?
- 为什么这是无限递归
- 尝试"复制"shared_ptr向上转换行为会导致复制构造函数上的无限递归(导致段错误)
- ConstexPR模板功能的无限递归
- 交换和移动无限递归
- 无限循环与无限递归.两者都未定义吗?
- 函数中的无限递归
- 运算符重载流提取运算符 (>>) C++会导致无限递归流提取
- C :Ostream无限递归
- 无限递归模板实例化使用clang时GCC工作正常
- 当我使用 boost 构建绝对路径时,无限递归
- 模板中的无限递归
- C++中的无限递归快速排序
- 尽管有停止条件,无限递归调用仍会执行,因为参数不会前进
- 在映射中插入地址时,新运算符重载会导致无限递归
- 可变参数模板实例化中的无限递归,试图构建任意深度的树状结构
- 调用原始版本的DLL挂钩函数时,我得到了无限递归
- std::swap 在 VS 2013 中导致无限递归
- 卡在无限递归中