On 8 June 2015 at 19:01, Ville Voutilainen 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 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 in_place_t. * 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(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.