constexpr函数不返回constexpr值?

时间:2013-09-10 19:03:38

标签: c++ c++11 hash tail-recursion 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");

1 个答案:

答案 0 :(得分:0)

问题是特定模板实例化的函数ascii_hash_t::f不是constexpr。这会阻止您以constexpr执行操作。

如果符合预期,请参阅http://ideone.com/heFuFP以获取示例。