串联和乘以幻数的问题。C++语言

Problem with consteval and multiplying magic numbers. c++

提问人:Bard 提问时间:11/2/2023 最后编辑:genpfaultBard 更新时间:11/2/2023 访问量:91

问:

好的,所以我正在尝试制作一个可以对字符串进行哈希处理的函数。

consteval int hash_string(const char* str)
{
    constexpr int magic_number = 13371337;
    
    int num1 = 1337;
    int num2 = 7331;
    
    //do stuffz here//
    
    return num1 + num2 * magic_number; //error
    return num1 + num2;                //okay :D
}

我假设这是由于整数溢出造成的,并且编译器无法解决它。但这是算法的一部分,我不在乎。

我希望 consteval 能够解决该函数,因为它都是编译时的东西。

C++ C++20 constexpr consteval

评论

5赞 Igor Tandetnik 11/2/2023
有符号整数溢出是未定义的行为。编译时评估不会执行未定义的行为。如果将所有整数都切换到 ?unsigned
1赞 Pepijn Kramer 11/2/2023
如果您想更好地控制,请使用std::uint64_tint
0赞 Pepijn Kramer 11/2/2023
此外,对于 consteval,请考虑使用 instead of (这样可以避免指针算术)const std::string_viewconst char*
1赞 463035818_is_not_an_ai 11/2/2023
错误消息是什么?
1赞 n. m. could be an AI 11/2/2023
整数溢出是未定义的行为。这意味着该程序在法律上被允许格式化您的硬盘、吃您的午餐和偷走您的女朋友。如果您希望其中任何一个成为“算法的一部分”,请继续使用可能导致整数溢出的算法。如果没有,请使用无符号类型。无符号算术不会溢出,它会环绕。

答:

2赞 Nicol Bolas 11/2/2023 #1

但这是算法的一部分,我不在乎。

但是你应该关心它,因为 C++ 不允许它。有符号整数溢出是未定义的行为。在不断的评估过程中,如果你引发了未定义的行为,你的程序就格式不正确。

因此出现编译错误。

如果您的算法依赖于未定义结果的内容,则需要更改您的算法。