Skip to content

Commit 45e1a7b

Browse files
burblebeetkoeppe
authored andcommitted
P2165R4 Compatibility between tuple and tuple-like objects
Editorial changes: * Added cross references in [tuple.rel] pointing at [basic.lookup.argdep]. * Addedd cross reference in [pairs.pair] pointing at [range.utility.helpers] for "different-from". * Reworded section title in [tuple.common.ref]. * Added references in synopsis.
1 parent d83b9b9 commit 45e1a7b

File tree

4 files changed

+389
-97
lines changed

4 files changed

+389
-97
lines changed

source/containers.tex

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9308,14 +9308,14 @@
93089308
typename iterator_traits<InputIterator>::value_type; // \expos
93099309
template<class InputIterator>
93109310
using @\placeholder{iter-key-type}@ = remove_const_t<
9311-
typename iterator_traits<InputIterator>::value_type::first_type>; // \expos
9311+
tuple_element_t<0, @\exposid{iter-value-type}@<InputIterator>>>; // \expos
93129312
template<class InputIterator>
93139313
using @\placeholder{iter-mapped-type}@ =
9314-
typename iterator_traits<InputIterator>::value_type::second_type; // \expos
9314+
tuple_element_t<1, @\exposid{iter-value-type}@<InputIterator>>; // \expos
93159315
template<class InputIterator>
93169316
using @\placeholder{iter-to-alloc-type}@ = pair<
9317-
add_const_t<typename iterator_traits<InputIterator>::value_type::first_type>,
9318-
typename iterator_traits<InputIterator>::value_type::second_type>; // \expos
9317+
add_const_t<tuple_element_t<0, @\exposid{iter-value-type}@<InputIterator>>>,
9318+
tuple_element_t<1, @\exposid{iter-value-type}@<InputIterator>>>; // \expos
93199319
template<ranges::@\libconcept{input_range}@ Range>
93209320
using @\exposid{range-key-type}@ =
93219321
remove_const_t<typename ranges::range_value_t<Range>::first_type>; // \expos

source/ranges.tex

Lines changed: 2 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1677,20 +1677,9 @@
16771677
@\libconcept{convertible_to}@<From, To> &&
16781678
!@\exposconcept{uses-nonqualification-pointer-conversion}@<decay_t<From>, decay_t<To>>;
16791679

1680-
template<class T>
1681-
concept @\defexposconceptnc{pair-like}@ = // \expos
1682-
!is_reference_v<T> && requires(T t) {
1683-
typename tuple_size<T>::type; // ensures \tcode{tuple_size<T>} is complete
1684-
requires @\libconcept{derived_from}@<tuple_size<T>, integral_constant<size_t, 2>>;
1685-
typename tuple_element_t<0, remove_const_t<T>>;
1686-
typename tuple_element_t<1, remove_const_t<T>>;
1687-
{ std::get<0>(t) } -> @\libconcept{convertible_to}@<const tuple_element_t<0, T>&>;
1688-
{ std::get<1>(t) } -> @\libconcept{convertible_to}@<const tuple_element_t<1, T>&>;
1689-
};
1690-
16911680
template<class T, class U, class V>
16921681
concept @\defexposconceptnc{pair-like-convertible-from}@ = // \expos
1693-
!@\libconcept{range}@<T> && @\exposconcept{pair-like}@<T> &&
1682+
!@\libconcept{range}@<T> && !is_reference_v<T> && @\exposconcept{pair-like}@<T> &&
16941683
@\libconcept{constructible_from}@<T, U, V> &&
16951684
@\exposconcept{convertible-to-non-slicing}@<U, tuple_element_t<0, T>> &&
16961685
@\libconcept{convertible_to}@<V, tuple_element_t<1, T>>;
@@ -7959,12 +7948,7 @@
79597948
namespace std::ranges {
79607949
template<class T, size_t N>
79617950
concept @\defexposconcept{has-tuple-element}@ = // \expos
7962-
requires(T t) {
7963-
typename tuple_size<T>::type;
7964-
requires N < tuple_size_v<T>;
7965-
typename tuple_element_t<N, T>;
7966-
{ std::get<N>(t) } -> @\libconcept{convertible_to}@<const tuple_element_t<N, T>&>;
7967-
};
7951+
@\exposconcept{tuple-like}@<T> && N < tuple_size_v<T>;
79687952

79697953
template<class T, size_t N>
79707954
concept @\defexposconcept{returnable-element}@ = // \expos
@@ -8594,9 +8578,6 @@
85948578
(!(@\libconcept{bidirectional_range}@<Rs> && ...) && (@\libconcept{common_range}@<Rs> && ...)) ||
85958579
((@\libconcept{random_access_range}@<Rs> && ...) && (@\libconcept{sized_range}@<Rs> && ...));
85968580

8597-
template<class... Ts>
8598-
using @\exposid{tuple-or-pair}@ = @\seebelow@; // \expos
8599-
86008581
template<class F, class Tuple>
86018582
constexpr auto @\exposid{tuple-transform}@(F&& f, Tuple&& tuple) { // \expos
86028583
return apply([&]<class... Ts>(Ts&&... elements) {
@@ -8664,17 +8645,6 @@
86648645
}
86658646
\end{codeblock}
86668647

8667-
\pnum
8668-
Given some pack of types \tcode{Ts},
8669-
the alias template \exposid{tuple-or-pair} is defined as follows:
8670-
\begin{itemize}
8671-
\item
8672-
If \tcode{sizeof...(Ts)} is 2,
8673-
\tcode{\exposid{tuple-or-pair}<Ts...>} denotes \tcode{pair<Ts...>}.
8674-
\item
8675-
Otherwise, \tcode{\exposid{tuple-or-pair}<Ts...>} denotes \tcode{tuple<Ts...>}.
8676-
\end{itemize}
8677-
86788648
\pnum
86798649
Two \tcode{zip_view} objects have the same underlying sequence if and only if
86808650
the corresponding elements of \exposid{views_} are equal\iref{concepts.equality}

source/support.tex

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,8 @@
718718
#define @\defnlibxname{cpp_lib_to_underlying}@ 202102L // also in \libheader{utility}
719719
#define @\defnlibxname{cpp_lib_transformation_trait_aliases}@ 201304L // also in \libheader{type_traits}
720720
#define @\defnlibxname{cpp_lib_transparent_operators}@ 201510L // also in \libheader{memory}, \libheader{functional}
721+
#define @\defnlibxname{cpp_lib_tuple_like}@ 202207L
722+
// also in \libheader{utility}, \libheader{tuple}, \libheader{map}, \libheader{unordered_map}
721723
#define @\defnlibxname{cpp_lib_tuple_element_t}@ 201402L // also in \libheader{tuple}
722724
#define @\defnlibxname{cpp_lib_tuples_by_type}@ 201304L // also in \libheader{utility}, \libheader{tuple}
723725
#define @\defnlibxname{cpp_lib_type_identity}@ 201806L // also in \libheader{type_traits}

0 commit comments

Comments
 (0)