我正在测试constexpr
公司C++的功能。我的代码是:
#include <cstdio>
#define LOG(KEY)
do {
constexpr unsigned key_len = sizeof(#KEY);
constexpr const char*const key_val = #KEY;
constexpr unsigned key_hash = bernstein_hash(key_val, key_len);
printf("%s : %un", #KEY, key_hash);
} while (0)
constexpr unsigned bernstein_hash (const char* key, const unsigned len)
{
const unsigned char *p = (const unsigned char *)key;
unsigned h = 0;
for (int i = 0; i < len; i++ )
h = 33 * h + p[i];
return h;
}
int main(int argc, char *argv[])
{
LOG(STACKOVERFLOW);
return 0;
}
但是,在尝试编译此内容时出现编译错误:
accessing value of ‘"STACKOVERFLOW"’ through a ‘const unsigned char’ glvalue in a constant expression
我不明白错误是什么意思。谷歌搜索错误也没有产生任何结果。
(const unsigned char *)key
相当于一个reinterpret_cast
。你不能在constexpr
代码中做到这一点。
最好将各个char
值转换为unsigned char
:
h = 33 * h + static_cast<unsigned char>(key[i]);
特别是在 C++20 中,当潜在的有符号到无符号转换已明确定义时。