функция constexpr не возвращает значение constexpr?

У меня есть функция hash_constexpr это занимает const char* и возвращает хеш, используя новый алгоритм. hash_constexpr функция должна генерировать хеш во время компиляции.

namespace detail
{
template<size_t Count>
inline constexpr size_t countof(const char(&string)[Count])
{
return Count - 1;
}

template<typename T>
struct ascii_hash_t
{
template<typename L>
static constexpr T f(L const& data, T hash, size_t i = 0)
{
return i < countof(data) ? f(data, (hash & (~0u)) ^ (hash << 7) ^ T(data[i]), i + 1) : hash;
}
};

template<typename T, typename L>
inline constexpr T generate_ascii_hash(L const& data)
{
return detail::ascii_hash_t<T>::f(data, 0);
}
};

template<size_t Count>
inline constexpr uint32_t hash_constexpr(const char(&string)[Count])
{
return detail::generate_ascii_hash<uint32_t>(string);
}

Моя проблема в том, что кажется, что hash_constexpr функция, по-видимому, на самом деле не возвращает constexpr значение. Когда я призываю это так:

constexpr uint32_t asd = hash_constexpr("asdasd");

Я получаю следующую ошибку:

Переменная Constexpr ‘asd’ должна быть инициализирована константным выражением

Что я делаю неправильно?

РЕДАКТИРОВАНИЕ № 1:

Обратите внимание, что этот вызов работает правильно:

constexpr int32_t countof_test = detail::countof("hello");

РЕДАКТИРОВАТЬ № 2:

Похоже, что этот вызов также работает правильно:

constexpr int32_t generate_ascii_hash_test = detail::generate_ascii_hash<int32_t>("asd");

0

Решение

Проблема в том, что функция ascii_hash_t::f, для конкретного экземпляра шаблона не является constexpr, Это мешает вам выполнить операцию как constexpr,

Увидеть http://ideone.com/heFuFP например, если он работает, как вы ожидаете.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]