我想以Symbol
与 ruby 相同的方式实现。
为此,我创建了一个用户定义的文字,它返回对应std::hash
的a std::basic_string<T>
。
代码很棒,但是当我在某处读到时,哈希函数在同一程序的多次执行中可能不一致。此外,我想在编译时进行此计算,这是 1) 不支持std::hash
和 2) 如果std::hash
返回值更改会破坏代码。
所以我写了下面的实现,基于java.lang.String.hashCode实现。
typedef size_t symbol;
template<typename CharT>
constexpr size_t constant_hash(const CharT* p, size_t h = 0) noexcept
{
return (*p == 0) ? h : constant_hash(p + 1, h * 31 + static_cast<size_t>(*p));
}
constexpr symbol operator "" _sym (const char* p, size_t n) noexcept
{
return constant_hash(p);
}
我的问题是:这个实现有什么问题吗?
我只能在 GCC 4.7.1 上对其进行测试,我想知道它是否符合标准并且也应该在其他编译器上工作。
我问这个是因为以前的实现是在 GCC 上工作的,但是如果二进制文件是用 clang++ 编译的,则会导致段错误(我认为增量运算符的未定义行为问题)。
提前致谢
编辑
使用 clang++(感谢 KennyTM)