Skip to content

Commit 7c52e33

Browse files
authored
Merge 2019-07 LWG Motion 29
P1474R1 Helpful pointers for ContiguousIterator Fixes #3033.
2 parents 2c8dfe9 + 61ed3e6 commit 7c52e33

File tree

2 files changed

+16
-13
lines changed

2 files changed

+16
-13
lines changed

source/iterators.tex

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1820,17 +1820,24 @@
18201820
RandomAccessIterator<I> &&
18211821
DerivedFrom<@\placeholdernc{ITER_CONCEPT}@(I), contiguous_iterator_tag> &&
18221822
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+
};
18241827
\end{codeblock}
18251828

18261829
\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},
18291834
and let \tcode{D} be \tcode{iter_difference_t<I>}.
18301835
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}
18341841

18351842
\rSec2[iterator.cpp17]{\Cpp{}17 iterator requirements}
18361843

source/ranges.tex

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -661,11 +661,7 @@
661661
\item
662662
Otherwise, if \tcode{ranges::begin(E)} is a valid expression whose type models
663663
\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))}.
669665

670666
\item
671667
Otherwise, \tcode{ranges::data(E)} is ill-formed.
@@ -1127,11 +1123,11 @@
11271123
}
11281124

11291125
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()));
11311127
}
11321128
constexpr auto data() const
11331129
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()));
11351131
}
11361132

11371133
constexpr auto size() requires ForwardRange<D> &&

0 commit comments

Comments
 (0)