常量正确性编译错误到模板函数中的无效转换错误

const-correctness compile-errors to invalid conversion error in template function

本文关键字:错误 无效 转换 函数 正确性 编译 常量      更新时间:2023-10-16

我构建了一个函数,该函数将单个偏移数偏移量解压缩为索引数组rindex。我用它来获取高维网格的相应索引。诚然,该功能的reverse_iterators看起来有点古怪,但它有效,我现在不知道如何以不同的方式做到这一点。

现在,一旦我使边界变量限定为常量,我就会得到一个关于reverse_iterators的非常神秘的编译时错误。谁能帮我一点?

#include <array>
#include <iostream>
template <typename size_type, typename crIt, typename rIt>
constexpr size_type unpeel(size_type offset, const crIt rbegin, const crIt rend,
rIt rindex) {
for (rIt rit = rbegin; rit != rend; rit++) {
*rindex++ = offset % *rit;
offset /= *rit;
}
return offset;
}
int main() {
size_t count = 0;
constexpr size_t N = 2;
const std::array<size_t, N> bounds{{2, 3}};
std::array<size_t, N> index{};
unpeel(0, bounds.rbegin(), bounds.rend(), index.rbegin());
}

下面是错误示例: https://ideone.com/nSLPaw

迭代器rbegin不能分配给rit- 您需要将其声明为常量迭代器(或简称auto):

for (auto rit = rbegin; rit != rend; rit++)

由于您是按值传递的,因此您可以简单地

while (rbegin != rend) {
*rindex++ = offset % *rbegin;
offset /= *rbegin++;
}

成功编译的完整代码:

template <typename size_type, typename InputIterator, typename OutputIterator>
constexpr size_type unpeel(size_type offset,
InputIterator rbegin,
InputIterator rend,
OutputIterator rindex)
{
for (; rbegin != rend;  ++rbegin) {
*rindex++ = offset % *rbegin;
offset /= *rbegin;
}
return offset;
}
#include <array>
#include <iostream>
int main() {
constexpr size_t N = 2;
const std::array<size_t, N> bounds{{2, 3}};
std::array<size_t, N> index{};
unpeel(0, bounds.rbegin(), bounds.rend(), index.rbegin());
}

我为迭代器模板类型使用了常规类型名称,以使需求更清晰。