我正在尝试实现一些将接收任意位数据(在编译时已知)并将它们的 CRC 计算为 a 的consteval
东西,因此我可以使用它来例如用整数键索引此类数据,而无需任何运行时开销。当输入是字符字符串文字时,我让它工作,但是当输入是字符串文字时,我正在努力让它工作wchar_t
。
我收到一个相当神秘的错误......
error: accessing value of '"T\000e\000s\000t\000\000"' through a 'const char' glvalue in a constant expression
...这似乎是由在 constexpr 上下文中使用 reinterpret_cast 引起的(这显然是不允许的)
我的问题是,有没有办法将任意数据解释为普通的旧字节数组?我不在乎它有多丑陋或缺乏可移植性(只要这一切都发生在编译时)。现在,只需使用数组wchar_t
作为输入来解决这个问题就足够了。显然,我可以“只是”为我想单独处理的每种类型重新实现 CRC 计算,但如果可能的话,我宁愿不这样做(事实上,对于比 POD 数组更复杂的任何事情,这将非常棘手)
作为参考,失败的代码如下:
// Details of CRCInternal omitted for brevity
template <size_t len> consteval uint32_t CRC32(const char (&str)[len])
{
return CRCInternal::crc32<len - 1>(str) ^ 0xFFFFFFFFu;
}
template <size_t len> consteval uint32_t CRC32FromWide(const wchar_t (&filename)[len])
{
return CRC32(reinterpret_cast<const char(&)[len * sizeof(wchar_t)]>(filename));
}
void main()
{
CRC32FromWide(L"Test"); // <==== Error
}