Как исправить: "constructed value does not match the lookup key" в absl::flat_hash_set

Я использую реализацию set от abseil. И когда я изменил функцию сравнения для Indexed<T_>:

было:

template<typename T_>
auto Indexed<T_>::operator==(Indexed<T_> const& indexed) const -> bool {
    return indexed.id_ == id_;
}

стало:

template<typename T_>
auto Indexed<T_>::operator==(Indexed<T_> const& indexed) const -> bool {
    return indexed.id_ == id_ && id_ != 0;
}

я получаю:

Interface_Engine_ex: .../abseil-src/absl/container/internal/raw_hash_set.h:3156: 
  void absl::container_internal::raw_hash_set<
    absl::container_internal::FlatHashSetPolicy<ie::Indexed<ie::TextStyle>>, 
    absl::hash_internal::Hash<ie::Indexed<ie::TextStyle>>, 
    std::equal_to<ie::Indexed<ie::TextStyle>>, 
    std::allocator<ie::Indexed<ie::TextStyle>>>::emplace_at(size_t, Args &&...) 

[Policy = absl::container_internal::FlatHashSetPolicy<ie::Indexed<ie::TextStyle>>, 
  Hash = absl::hash_internal::Hash<ie::Indexed<ie::TextStyle>>, 
  Eq = std::equal_to<ie::Indexed<ie::TextStyle>>, 
  Alloc = std::allocator<ie::Indexed<ie::TextStyle>>, 
  Args = <ie::Indexed<ie::TextStyle>>]: 

Assertion `PolicyTraits::apply(FindElement{*this}, *iterator_at(i)) == iterator_at(i) && 
  "constructed value does not match the lookup key"' failed.

При этом хеш-функция выглядит так:

template<typename T_>
auto std::hash<ie::Indexed<T_> >::operator()(ie::Indexed<T_> const& indexed) -> size_t{
    return indexed.get_id();
}

Ответы (1 шт):

Автор решения: Andrewkoro105

Помогло изменение функции сравнения на:

template<typename T_>
auto Indexed<T_>::operator==(Indexed<T_> const& indexed) const -> bool {
    return (indexed.id_ == id_ && id_ != 0) || this == &indexed;
}
→ Ссылка