Date
2024-03-13.10:42:50
Message id
14005

Content

Proposed resolution:

This wording is relative to N4971.

  1. Modify [pointer.conversion] as indicated:

    template<class Ptr> constexpr auto to_address(const Ptr& p) noexcept;

    -?- Constraints: Either the expression pointer_traits<Ptr>::to_address(p) is well-formed (see [pointer.traits.optmem]), or the expression p.operator->() is well-formed.

    -3- Returns: pointer_traits<Ptr>::to_address(p) if that expression is well-formed (see [pointer.traits.optmem]), otherwise to_address(p.operator->()).

  2. Modify [iterator.concept.contiguous] as indicated:

    -1- The contiguous_iterator concept provides a guarantee that the denoted elements are stored contiguously in memory.

    
    template<class I>
      concept contiguous_iterator =
        random_access_iterator<I> &&
        derived_from<ITER_CONCEPT(I), contiguous_iterator_tag> &&
        is_lvalue_reference_v<iter_reference_t<I>> &&
        same_as<iter_value_t<I>, remove_cvref_t<iter_reference_t<I>>> &&
        requires(const I& i) {
          { to_address(i) } -> same_as<add_pointer_t<iter_reference_t<I>>>;
        }
        std::same_as<decltype([] { return std::to_address(std::declval<I>()); }()),
                     std::add_pointer_t<std::iter_reference_t<I>>>;
    
    The submitter welcomes less awkward alternatives to achieve the desired hard error for contiguous_iterator.