Classes and class hierarchies
C.89
Сделайте `hash` `noexcept`
Причина
Пользователи контейнеров с хешем используют хеш косвенно и не ожидают, что простой доступ выбросит исключение. Это требование стандартной библиотеки.
Плохой пример
template<>
struct hash<My_type> { // thoroughly bad hash specialization
using result_type = size_t;
using argument_type = My_type;
size_t operator()(const My_type & x) const
{
size_t xs = x.s.size();
if (xs < 4) throw Bad_My_type{}; // "Nobody expects the Spanish inquisition!"
return hash<size_t>()(x.s.size()) ^ trim(x.s);
}
};
int main()
{
unordered_map<My_type, int> m;
My_type mt{ "asdfg" };
m[mt] = 7;
cout << m[My_type{ "asdfg" }] << '\n';
}
Если вы должны определить специализацию hash, попробуйте просто позволить ему комбинировать специализации hash стандартной библиотеки с помощью ^ (xor). Это, как правило, работает лучше, чем "находчивость" для не-специалистов.
Применение
- Отметьте выбрасывающие
hashes.