[v3 PATCH] Implement N4387 and LWG 2367

Ville Voutilainen ville.voutilainen@gmail.com
Sat Jun 13 18:05:00 GMT 2015

On 8 June 2015 at 19:01, Ville Voutilainen <ville.voutilainen@gmail.com> wrote:
>> Yes, it should be uglified, thanks.
> Ahem, yes, actually removed since it's there only to be specialized.

Another round! The new patch
- makes sure not to change non-deduced parameters to deduced ones, and adds
tests for that.
- removes the name of the bool non-type template parameter for the 'concepts'.
- introduces shortcuts for making the use of the 'concepts' more readable.
- changes library tag types into non-default-constructible ones.
Without this, we
can run into an ambiguity between the constructor template that takes
(const _T1&, const _T2&)
and the one that takes (allocator_arg_t, Alloc), when the call site
calls it with ({}, somethingelse).
We could avoid that by just not doing that in the library
(experimental string searchers do that),
but it's just daft to allow default-constructing a library tag type. I
have filed an LWG issue to
fix all tag types, but this patch doesn't yet touch nothrow_t and
optional's in_place_t. I expect
to submit follow-up patches for that.

Tested on Linux-PPC64.

2015-06-13  Ville Voutilainen  <ville.voutilainen@gmail.com>
    Implement N4387, "improving pair and tuple" and
    LWG 2367, "pair and tuple are not correctly implemented for
    is_constructible with no args". Also make the standard tag types
    non-default-constructible. std::nothrow_t not taken care
    of yet in that regard, nor std::experimental::optional's
    * include/bits/stl_pair.h (piecewise_construct_t,
    piecewise_construct): Make non-default-constructible and adjust.
    * include/bits/stl_pair.h (_ConstructiblePair,
    _ImplicitlyConvertiblePair, _MoveConstructiblePair,
    _ImplicitlyMoveConvertiblePair): New.
    * include/bits/stl_pair.h (pair()): Constrain it.
    * include/bits/stl_pair.h (pair(const _T1&, const _T2&),
    pair(const pair<_U1, _U2>&), pair(_U1&&, const _T2&),
    pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
    pair(pair<_U1, _U2>&&)): Make conditionally explicit.
    * include/bits/uses_allocator.h (allocator_arg_t,
    allocator_arg): Make non-default-constructible and adjust.
    * include/std/mutex (defer_lock_t, defer_lock,
    try_to_lock_t, try_to_lock, adopt_lock_t, adopt_lock):
    Make non-default-constructible and adjust.
    * include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
    * include/std/tuple (tuple()): Constrain it.
    * include/std/tuple (tuple(const _UElements&...),
    tuple(_UElements&&...), tuple(const tuple<_UElements...>&),
    tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
    tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
    tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
    tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
    tuple(const pair<_U1, _U2>&),
    tuple(pair<_U1, _U2>&&),
    tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
    tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
    conditionally explicit.
    * src/c++11/compatibility-thread-c++0x.cc: Adjust.
    * testsuite/20_util/pair/cons/explicit_construct.cc: New.
    * estsuite/20_util/pair/piecewise.cc: Adjust.
    * testsuite/20_util/pair/requirements/dr2367.cc: New.
    * testsuite/20_util/tuple/cons/explicit_construct.cc: New.
    * testsuite/20_util/tuple/requirements/dr2367.cc: New.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: conditional-explicit4.diff.gz
Type: application/x-gzip
Size: 6887 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/libstdc++/attachments/20150613/1bd34ab3/attachment.bin>

More information about the Libstdc++ mailing list