File tree Expand file tree Collapse file tree 2 files changed +16
-13
lines changed Expand file tree Collapse file tree 2 files changed +16
-13
lines changed Original file line number Diff line number Diff line change 1820
1820
RandomAccessIterator<I> &&
1821
1821
DerivedFrom<@\placeholdernc {ITER_CONCEPT}@(I), contiguous_iterator_tag> &&
1822
1822
is_lvalue_reference_v<iter_reference_t<I>> &&
1823
- Same<iter_value_t<I>, remove_cvref_t<iter_reference_t<I>>>;
1823
+ Same<iter_value_t<I>, remove_cvref_t<iter_reference_t<I>>> &&
1824
+ requires(const I& i) {
1825
+ { to_address(i) } -> Same<add_pointer_t<iter_reference_t<I>>>;
1826
+ };
1824
1827
\end {codeblock }
1825
1828
1826
1829
\pnum
1827
- Let \tcode {a} and \tcode {b} be dereferenceable iterators of type \tcode {I}
1828
- such that \tcode {b} is reachable from \tcode {a},
1830
+ Let \tcode {a} and \tcode {b} be dereferenceable iterators and
1831
+ \tcode {c} be a non-dereferenceable iterator of type \tcode {I}
1832
+ such that \tcode {b} is reachable from \tcode {a} and
1833
+ \tcode {c} is reachable from \tcode {b},
1829
1834
and let \tcode {D} be \tcode {iter_difference_t<I>}.
1830
1835
The type \tcode {I} models \libconcept {ContiguousIterator} only if
1831
- \tcode {addressof(*(a + D(b - a)))}
1832
- is equal to
1833
- \tcode {addressof(*a) + D(b - a)}.
1836
+ \begin {itemize }
1837
+ \item \tcode {to_address(a) == addressof(*a)},
1838
+ \item \tcode {to_address(b) == to_address(a) + D(b - a)}, and
1839
+ \item \tcode {to_address(c) == to_address(a) + D(c - a)}.
1840
+ \end {itemize }
1834
1841
1835
1842
\rSec 2[iterator.cpp17]{\Cpp {}17 iterator requirements}
1836
1843
Original file line number Diff line number Diff line change 661
661
\item
662
662
Otherwise, if \tcode {ranges::begin(E)} is a valid expression whose type models
663
663
\tcode {ContiguousIterator},
664
- \begin {codeblock }
665
- ranges::begin(E) == ranges::end(E) ? nullptr : addressof(*ranges::begin(E))
666
- \end {codeblock }
667
-
668
- except that \tcode {E} is evaluated only once.
664
+ \tcode {to_address(ranges::begin(E))}.
669
665
670
666
\item
671
667
Otherwise, \tcode {ranges::data(E)} is ill-formed.
1127
1123
}
1128
1124
1129
1125
constexpr auto data() requires ContiguousIterator<iterator_t<D>> {
1130
- return ranges::empty(derived()) ? nullptr : addressof(* ranges::begin(derived()));
1126
+ return to_address( ranges::begin(derived()));
1131
1127
}
1132
1128
constexpr auto data() const
1133
1129
requires Range<const D> && ContiguousIterator<iterator_t<const D>> {
1134
- return ranges::empty(derived()) ? nullptr : addressof(* ranges::begin(derived()));
1130
+ return to_address( ranges::begin(derived()));
1135
1131
}
1136
1132
1137
1133
constexpr auto size() requires ForwardRange<D> &&
You can’t perform that action at this time.
0 commit comments