0

我有一个函数hash_constexpr,它接受 aconst 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");
4

1 回答 1

0

问题在于ascii_hash_t::f,对于特定模板实例化的函数不是constexpr. 这可以防止您以constexpr.

如果它按预期工作,请参阅http://ideone.com/heFuFP以获取示例。

于 2013-09-10T19:14:07.327 回答