通过 constexpr 中的 'const char *' glvalue 访问字符串文字的值会出错



我正在测试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 中,当潜在的有符号到无符号转换已明确定义时。

最新更新