【发布时间】:2019-03-26 09:19:00
【问题描述】:
我正在尝试将 int 作为参数并单独对其字节进行操作,例如采用 0xDEADF00D 并逐个处理每个字节:0xDE 0xAD 0xF0 0x0D
为此,我完成了以下代码:
template <int state, int seed>
constexpr static uint32_t CalculateRandomFromState()
{
const char bytes[4] = {
(state >> 24) & 0xFF,
(state >> 16) & 0xFF,
(state >> 8) & 0xFF,
state & 0xFF,
};
constexpr auto value = Compiletime::Hash<seed, sizeof(bytes)>(bytes);
return value;
}
HashFn的sig是:
template <const uint32_t seed, const uint32_t size = NULL>
constexpr uint32_t Hash(const char* message)
编译失败:
错误 C2131:表达式未计算为常量
注意:失败是由在其生命周期之外读取变量引起的
注意:查看“字节”的用法
我在 StackOverflow 上阅读过关于参数可能无法在编译时评估的主题,(这就是我将大部分参数切换到模板变量的原因,因此可以 100% 保证它们是编译时的) 但在这种情况下,为什么它给出错误似乎不合逻辑。 bytes 的值取决于编译时的值,字节也是常量。
为什么它会超出它的生命周期?如果我说 "somestring" 而不是变量 bytes 那么它编译完美。
这里有什么不可评估的常量?
【问题讨论】:
-
你可以制作一个minimal reproducible example 以便它可以被复制吗?另外你使用的是哪个版本的 VS 和 MSVC?
-
变量
bytes是const但不是constexpr。每次调用CalculateRandomFromState时都会创建、重新创建和初始化它。你能改成constexpr吗?那么也许你也可以将它作为模板参数传递? -
@Someprogrammerdude 不是隐含的
constexpr因为是const并且有一个constexpr的初始值吗? -
@HolyBlackCat - 当您实际 attempt to compute the hash 时出现错误。
标签: c++ visual-c++ c++17 constexpr