libstdc++: Separate construct/convertibility tests for std::tuple
authorPatrick Palka <ppalka@redhat.com>
Tue, 23 Aug 2022 17:35:49 +0000 (13:35 -0400)
committerPatrick Palka <ppalka@redhat.com>
Tue, 23 Aug 2022 17:35:49 +0000 (13:35 -0400)
commit02f6b405f0e9dc7a8868fecef9a048b79c433125
tree7a0ef673a67bb94c053bc4dcc0f1eed31687c852
parente85bb1881e57e53306ede2a15f30d06480d69886
libstdc++: Separate construct/convertibility tests for std::tuple

P2321R2 adds additional conditionally explicit constructors to std::tuple
which we'll concisely implement in a subsequent patch using explicit(bool),
like in our C++20 std::pair implementation.  This prerequisite patch
adds member typedefs to _TupleConstraints for testing element-wise
constructibility and convertibility separately; we'll use the first in
the new constructors' constraints, and the second in their explicit
specifier.

In passing, this patch also redefines the existing member predicates
__is_ex/implicitly_constructible in terms of these new members.  This
seems to reduce compile time and memory usage by about 10% for large
tuples when using the converting constructors that're constrained by
_Explicit/_ImplicitCtor.

libstdc++-v3/ChangeLog:

* include/std/tuple (_TupleConstraints::__convertible): Define.
(_TupleConstraints::__constructible): Define.
(_TupleConstraints::__is_explicitly_constructible): Redefine this
in terms of __convertible and __constructible.
(_TupleConstraints::__is_implicitly_constructible): Likewise.
libstdc++-v3/include/std/tuple