Proposed resolution:
This wording is relative to N4971.
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 expressionp.operator->()
is well-formed.-3- Returns:
pointer_traits<Ptr>::to_address(p)
if that expression is well-formed(see [pointer.traits.optmem]), otherwiseto_address(p.operator->())
.
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>>>;
contiguous_iterator
.