C++ 在C+;中使用long初始化枚举时出现问题+;

C++ 在C+;中使用long初始化枚举时出现问题+;,c++,enums,long-integer,C++,Enums,Long Integer,我正在尝试使用类型标签的哈希代码初始化枚举: enum ValueType { CLOSED = hashCode("CLOSED"), OPEN = hashCode("OPEN"), SEKIHAIRITSU = hashCode("SEKIHAIRITSU"), ZWEITMANDAT = hashCode("ZWEITMANDAT") }; ValueType valuety

我正在尝试使用类型标签的哈希代码初始化枚举:

enum ValueType {
    CLOSED = hashCode("CLOSED"),
    OPEN = hashCode("OPEN"),
    SEKIHAIRITSU = hashCode("SEKIHAIRITSU"),
    ZWEITMANDAT = hashCode("ZWEITMANDAT")
};

ValueType valuetype;
hashCode
函数是Java函数的一个实现:

constexpr long hashCode(const char *string) {
    long h = 0;
    int off = 0;

    for (int i = 0; i < strlen(string); i++) {
        h = 31 * h + string[off++];
    }

    return h;
}
constexpr长hashCode(const char*string){
长h=0;
int off=0;
for(int i=0;i
我在
Sekihairitsu
Zweitmandat
上收到一个错误:

表达式必须有一个常量值--值超出了“long”的范围

奇怪的是,它并不长。当我自己运行
hashCode
函数时,它会为Sekihairitsu返回
-1606024481
,为Zweitmanad返回
-710079088
。它们都不在long甚至int的范围之外


有人知道问题出在哪里吗?我已经尝试了
枚举值类型:long

您有整数溢出。问问自己,当你处理的所有东西都是正数时,你是如何得到负数的。在我的平台上,
std::strlen
不是
constexpr
。(不确定是否应该,我的编译器也不兼容。)@NathanOliver我知道,但为什么?我自己运行了这个函数,它运行正常,没有整数溢出。枚举初始化中的什么会导致整数溢出?有符号整数溢出是未定义的行为,但您始终可以使用这样的无符号类型@MatG谢谢,我让它变得更简单了。只需将
constepr long
更改为
constepr unsigned long
,以同样的方式更改
h
,它就可以工作了!