Support allocators in tuples of zero size.

* include/std/tuple (tuple<>::tuple(),
	tuple<>::tuple(allocator_arg_t, const _Alloc&),
	tuple<>::tuple(allocator_arg_t, const _Alloc&, const tuple&)): New.
	* testsuite/20_util/tuple/cons/allocators.cc: Adjust.

From-SVN: r237143
This commit is contained in:
Ville Voutilainen 2016-06-06 19:28:59 +03:00 committed by Ville Voutilainen
parent 36f9ad6933
commit dbc6221fe5
3 changed files with 38 additions and 0 deletions

View File

@ -1,3 +1,11 @@
2016-06-06 Ville Voutilainen <ville.voutilainen@gmail.com>
Support allocators in tuples of zero size.
* include/std/tuple (tuple<>::tuple(),
tuple<>::tuple(allocator_arg_t, const _Alloc&),
tuple<>::tuple(allocator_arg_t, const _Alloc&, const tuple&)): New.
* testsuite/20_util/tuple/cons/allocators.cc: Adjust.
2016-06-06 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/71320

View File

@ -876,6 +876,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{
public:
void swap(tuple&) noexcept { /* no-op */ }
// We need the default since we're going to define no-op
// allocator constructors.
tuple() = default;
// No-op allocator constructors.
template<typename _Alloc>
tuple(allocator_arg_t, const _Alloc&) { }
template<typename _Alloc>
tuple(allocator_arg_t, const _Alloc&, const tuple&) { }
};
/// Partial specialization, 2-element tuple.

View File

@ -162,8 +162,30 @@ void test01()
}
void test02()
{
bool test __attribute__((unused)) = true;
using std::allocator_arg;
using std::tuple;
using std::make_tuple;
typedef tuple<> test_type;
MyAlloc a;
// default construction
test_type t1(allocator_arg, a);
// copy construction
test_type t2(allocator_arg, a, t1);
// move construction
test_type t3(allocator_arg, a, std::move(t1));
// make_tuple
test_type empty = make_tuple();
}
int main()
{
test01();
test02();
return 0;
}