constexpr
в объявлении функции не требует, чтобы все пути оценки приводили к постоянному выражению.То, является ли результат вызова функции constexpr
, может зависеть от входных аргументов.
Предполагается, что ваша хеш-функция выглядит следующим образом:
template <uint32_t seed, uint32_t size>
constexpr uint32_t Hash(const char* message)
{
uint32_t rc = seed;
for (uint32_t i = 0; i < size; ++i)
rc += message[i];
return rc;
}
Это приведет к константному выражениюiff message
является константным выражением.
Но вы вызываете его с неконстантным выражением:
const char bytes[4] = {
(state >> 24) & 0xFF,
(state >> 16) & 0xFF,
(state >> 8) & 0xFF,
state & 0xFF,
};
constexpr auto value = Compiletime::Hash<seed, sizeof(bytes)>(bytes);
Каждый раз, когда вызывается Hash(bytes)
, bytes
потенциальноиметь другой адрес.
Вы можете заставить его работать, просто объявив bytes
constexpr
:
template <int state, int seed>
constexpr static uint32_t CalculateRandomFromState()
{
constexpr 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;
}