On Mon, 8 Sept 2025 at 07:46, Tomasz Kaminski <tkami...@redhat.com> wrote:
>
>
>
> On Fri, Sep 5, 2025 at 10:57 PM Jonathan Wakely <jwak...@redhat.com> wrote:
>>
>> C++17 has a 'Requires:' precondition that the two random access iterator
>> types have the same value type. In C++20 that is a 'Mandates:'
>> requirement which we must diagnose.
>>
>> Although we could diagnose it in C++17, that might be a breaking change
>> for any users relying on it today. Also I am lazy and wanted to use
>> C++20's std::iter_value_t for the checks. So this only enforces the
>> requirement for C++20 and later.
>
> Could add a word here, on the motivation for checking that. If we allow 
> different
> types, we may get ones for which equality is transparent, but hashes are not 
> equal
> for equivalent object of different types. One example would be 
> chrono::durations,
> with different Ratios.

Like so:

#ifdef __glibcxx_concepts // >= C++20
      // Value types must be the same for hash function and predicate
      // to give consistent results for lookup in the map.
      static_assert(is_same_v<iter_value_t<_RAIter>,
                  iter_value_t<_RandomAccessIterator2>>);
#endif

In theory, C++20 heterogeneous lookup for unordered containers should
make it possible to support heterogeneous value types here too. But
that would be a design question for LEWG, I think.

Reply via email to