Commit da27f556 by François Dumont

hashtable_policy.h (_Prime_rehash_policy): Constructor noexcept qualified.

2014-09-06  François Dumont  <fdumont@gcc.gnu.org>

	* include/bits/hashtable_policy.h (_Prime_rehash_policy): Constructor
	noexcept qualified.
	(_Hash_code_base<>): All specialization default constructible if
	possible.
	(_Hashtable_base<>): Likewise.
	* include/bits/hashtable.h (_Hashtable<>()): Implementation defaulted.
	* include/bits/unordered_map.h (unordered_map<>::unordered_map()): New,
	implementation defaulted.
	(unordered_multimap<>::unordered_multimap()): Likewise.
	* include/bits/unordered_set.h
	(unordered_set<>::unordered_set()): Likewise.
	(unordered_multiset<>::unordered_multiset()): Likewise.
	* include/debug/unordered_map: Likewise.
	* include/debug/unordered_set: Likewise.
	* testsuite/23_containers/unordered_map/allocator/noexcept.cc
	(test04()): New.
	* testsuite/23_containers/unordered_multimap/allocator/noexcept.cc
	(test04()): New.
	* testsuite/23_containers/unordered_set/allocator/noexcept.cc
	(test04()): New.
	* testsuite/23_containers/unordered_multiset/allocator/noexcept.cc
	(test04()): New.

From-SVN: r214986
parent 4fe24839
2014-09-06 François Dumont <fdumont@gcc.gnu.org>
* include/bits/hashtable_policy.h (_Prime_rehash_policy): Constructor
noexcept qualified.
(_Hash_code_base<>): All specialization default constructible if
possible.
(_Hashtable_base<>): Likewise.
* include/bits/hashtable.h (_Hashtable<>()): Implementation defaulted.
* include/bits/unordered_map.h (unordered_map<>::unordered_map()): New,
implementation defaulted.
(unordered_multimap<>::unordered_multimap()): Likewise.
* include/bits/unordered_set.h
(unordered_set<>::unordered_set()): Likewise.
(unordered_multiset<>::unordered_multiset()): Likewise.
* include/debug/unordered_map: Likewise.
* include/debug/unordered_set: Likewise.
* testsuite/23_containers/unordered_map/allocator/noexcept.cc
(test04()): New.
* testsuite/23_containers/unordered_multimap/allocator/noexcept.cc
(test04()): New.
* testsuite/23_containers/unordered_set/allocator/noexcept.cc
(test04()): New.
* testsuite/23_containers/unordered_multiset/allocator/noexcept.cc
(test04()): New.
2014-08-30 John David Anglin <danglin@gcc.gnu.org> 2014-08-30 John David Anglin <danglin@gcc.gnu.org>
* config/abi/post/hppa-linux-gnu/baseline_symbols.txt: Update. * config/abi/post/hppa-linux-gnu/baseline_symbols.txt: Update.
......
...@@ -310,10 +310,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -310,10 +310,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
const_local_iterator; const_local_iterator;
private: private:
__bucket_type* _M_buckets; __bucket_type* _M_buckets = &_M_single_bucket;
size_type _M_bucket_count; size_type _M_bucket_count = 1;
__node_base _M_before_begin; __node_base _M_before_begin;
size_type _M_element_count; size_type _M_element_count = 0;
_RehashPolicy _M_rehash_policy; _RehashPolicy _M_rehash_policy;
// A single bucket used when only need for 1 bucket. Especially // A single bucket used when only need for 1 bucket. Especially
...@@ -322,7 +322,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -322,7 +322,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// qualified. // qualified.
// Note that we can't leave hashtable with 0 bucket without adding // Note that we can't leave hashtable with 0 bucket without adding
// numerous checks in the code to avoid 0 modulus. // numerous checks in the code to avoid 0 modulus.
__bucket_type _M_single_bucket; __bucket_type _M_single_bucket = nullptr;
bool bool
_M_uses_single_bucket(__bucket_type* __bkts) const _M_uses_single_bucket(__bucket_type* __bkts) const
...@@ -382,8 +382,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -382,8 +382,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
void void
_M_reset() noexcept; _M_reset() noexcept;
_Hashtable(const _H1& __h1, const _H2& __h2, const _Hash& __h,
const _Equal& __eq, const _ExtractKey& __exk,
const allocator_type& __a)
: __hashtable_base(__exk, __h1, __h2, __h, __eq),
__hashtable_alloc(__node_alloc_type(__a))
{ }
public: public:
// Constructor, destructor, assignment, swap // Constructor, destructor, assignment, swap
_Hashtable() = default;
_Hashtable(size_type __bucket_hint, _Hashtable(size_type __bucket_hint,
const _H1&, const _H2&, const _Hash&, const _H1&, const _H2&, const _Hash&,
const _Equal&, const _ExtractKey&, const _Equal&, const _ExtractKey&,
...@@ -407,12 +415,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -407,12 +415,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// Use delegating constructors. // Use delegating constructors.
explicit explicit
_Hashtable(const allocator_type& __a) _Hashtable(const allocator_type& __a)
: _Hashtable(10, _H1(), _H2(), _Hash(), key_equal(), : __hashtable_alloc(__node_alloc_type(__a))
__key_extract(), __a)
{ } { }
explicit explicit
_Hashtable(size_type __n = 10, _Hashtable(size_type __n,
const _H1& __hf = _H1(), const _H1& __hf = _H1(),
const key_equal& __eql = key_equal(), const key_equal& __eql = key_equal(),
const allocator_type& __a = allocator_type()) const allocator_type& __a = allocator_type())
...@@ -791,15 +798,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -791,15 +798,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
const _H1& __h1, const _H2& __h2, const _Hash& __h, const _H1& __h1, const _H2& __h2, const _Hash& __h,
const _Equal& __eq, const _ExtractKey& __exk, const _Equal& __eq, const _ExtractKey& __exk,
const allocator_type& __a) const allocator_type& __a)
: __hashtable_base(__exk, __h1, __h2, __h, __eq), : _Hashtable(__h1, __h2, __h, __eq, __exk, __a)
__map_base(),
__rehash_base(),
__hashtable_alloc(__node_alloc_type(__a)),
_M_element_count(0),
_M_rehash_policy()
{ {
_M_bucket_count = _M_rehash_policy._M_next_bkt(__bucket_hint); auto __bkt = _M_rehash_policy._M_next_bkt(__bucket_hint);
_M_buckets = _M_allocate_buckets(_M_bucket_count); if (__bkt > _M_bucket_count)
{
_M_buckets = _M_allocate_buckets(__bkt);
_M_bucket_count = __bkt;
}
} }
template<typename _Key, typename _Value, template<typename _Key, typename _Value,
...@@ -814,20 +820,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -814,20 +820,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
const _H1& __h1, const _H2& __h2, const _Hash& __h, const _H1& __h1, const _H2& __h2, const _Hash& __h,
const _Equal& __eq, const _ExtractKey& __exk, const _Equal& __eq, const _ExtractKey& __exk,
const allocator_type& __a) const allocator_type& __a)
: __hashtable_base(__exk, __h1, __h2, __h, __eq), : _Hashtable(__h1, __h2, __h, __eq, __exk, __a)
__map_base(),
__rehash_base(),
__hashtable_alloc(__node_alloc_type(__a)),
_M_element_count(0),
_M_rehash_policy()
{ {
auto __nb_elems = __detail::__distance_fw(__f, __l); auto __nb_elems = __detail::__distance_fw(__f, __l);
_M_bucket_count = auto __bkt_count =
_M_rehash_policy._M_next_bkt( _M_rehash_policy._M_next_bkt(
std::max(_M_rehash_policy._M_bkt_for_elements(__nb_elems), std::max(_M_rehash_policy._M_bkt_for_elements(__nb_elems),
__bucket_hint)); __bucket_hint));
_M_buckets = _M_allocate_buckets(_M_bucket_count); if (__bkt_count > _M_bucket_count)
{
_M_buckets = _M_allocate_buckets(__bkt_count);
_M_bucket_count = __bkt_count;
}
__try __try
{ {
for (; __f != __l; ++__f) for (; __f != __l; ++__f)
...@@ -1101,7 +1107,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -1101,7 +1107,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__rehash_base(__ht), __rehash_base(__ht),
__hashtable_alloc( __hashtable_alloc(
__node_alloc_traits::_S_select_on_copy(__ht._M_node_allocator())), __node_alloc_traits::_S_select_on_copy(__ht._M_node_allocator())),
_M_buckets(), _M_buckets(nullptr),
_M_bucket_count(__ht._M_bucket_count), _M_bucket_count(__ht._M_bucket_count),
_M_element_count(__ht._M_element_count), _M_element_count(__ht._M_element_count),
_M_rehash_policy(__ht._M_rehash_policy) _M_rehash_policy(__ht._M_rehash_policy)
...@@ -1175,7 +1181,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -1175,7 +1181,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__map_base(__ht), __map_base(__ht),
__rehash_base(__ht), __rehash_base(__ht),
__hashtable_alloc(__node_alloc_type(__a)), __hashtable_alloc(__node_alloc_type(__a)),
_M_buckets(), _M_buckets(nullptr),
_M_bucket_count(__ht._M_bucket_count), _M_bucket_count(__ht._M_bucket_count),
_M_element_count(__ht._M_element_count), _M_element_count(__ht._M_element_count),
_M_rehash_policy(__ht._M_rehash_policy) _M_rehash_policy(__ht._M_rehash_policy)
...@@ -1218,8 +1224,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -1218,8 +1224,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
~_Hashtable() noexcept ~_Hashtable() noexcept
{ {
clear(); clear();
if (_M_buckets) _M_deallocate_buckets();
_M_deallocate_buckets();
} }
template<typename _Key, typename _Value, template<typename _Key, typename _Value,
......
...@@ -460,7 +460,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -460,7 +460,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
/// smallest prime that keeps the load factor small enough. /// smallest prime that keeps the load factor small enough.
struct _Prime_rehash_policy struct _Prime_rehash_policy
{ {
_Prime_rehash_policy(float __z = 1.0) _Prime_rehash_policy(float __z = 1.0) noexcept
: _M_max_load_factor(__z), _M_next_resize(0) { } : _M_max_load_factor(__z), _M_next_resize(0) { }
float float
...@@ -1071,7 +1071,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -1071,7 +1071,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
typedef void* __hash_code; typedef void* __hash_code;
typedef _Hash_node<_Value, false> __node_type; typedef _Hash_node<_Value, false> __node_type;
// We need the default constructor for the local iterators. // We need the default constructor for the local iterators and _Hashtable
// default constructor.
_Hash_code_base() = default; _Hash_code_base() = default;
_Hash_code_base(const _ExtractKey& __ex, const _H1&, const _H2&, _Hash_code_base(const _ExtractKey& __ex, const _H1&, const _H2&,
...@@ -1161,7 +1162,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -1161,7 +1162,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
typedef std::size_t __hash_code; typedef std::size_t __hash_code;
typedef _Hash_node<_Value, false> __node_type; typedef _Hash_node<_Value, false> __node_type;
// We need the default constructor for the local iterators. // We need the default constructor for the local iterators and _Hashtable
// default constructor.
_Hash_code_base() = default; _Hash_code_base() = default;
_Hash_code_base(const _ExtractKey& __ex, _Hash_code_base(const _ExtractKey& __ex,
...@@ -1250,6 +1252,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -1250,6 +1252,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
typedef std::size_t __hash_code; typedef std::size_t __hash_code;
typedef _Hash_node<_Value, true> __node_type; typedef _Hash_node<_Value, true> __node_type;
// We need the default constructor for _Hashtable default constructor.
_Hash_code_base() = default;
_Hash_code_base(const _ExtractKey& __ex, _Hash_code_base(const _ExtractKey& __ex,
const _H1& __h1, const _H2& __h2, const _H1& __h1, const _H2& __h2,
const _Default_ranged_hash&) const _Default_ranged_hash&)
...@@ -1694,6 +1698,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -1694,6 +1698,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__hash_code, __hash_cached::value>; __hash_code, __hash_cached::value>;
protected: protected:
_Hashtable_base() = default;
_Hashtable_base(const _ExtractKey& __ex, const _H1& __h1, const _H2& __h2, _Hashtable_base(const _ExtractKey& __ex, const _H1& __h1, const _H2& __h2,
const _Hash& __hash, const _Equal& __eq) const _Hash& __hash, const _Equal& __eq)
: __hash_code_base(__ex, __h1, __h2, __hash), _EqualEBO(__eq) : __hash_code_base(__ex, __h1, __h2, __hash), _EqualEBO(__eq)
...@@ -1906,6 +1911,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -1906,6 +1911,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__alloc_rebind<__node_alloc_type, __bucket_type>; __alloc_rebind<__node_alloc_type, __bucket_type>;
using __bucket_alloc_traits = std::allocator_traits<__bucket_alloc_type>; using __bucket_alloc_traits = std::allocator_traits<__bucket_alloc_type>;
_Hashtable_alloc() = default;
_Hashtable_alloc(const _Hashtable_alloc&) = default; _Hashtable_alloc(const _Hashtable_alloc&) = default;
_Hashtable_alloc(_Hashtable_alloc&&) = default; _Hashtable_alloc(_Hashtable_alloc&&) = default;
......
...@@ -128,15 +128,18 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -128,15 +128,18 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
//construct/destroy/copy //construct/destroy/copy
/// Default constructor.
unordered_map() = default;
/** /**
* @brief Default constructor creates no elements. * @brief Default constructor creates no elements.
* @param __n Initial number of buckets. * @param __n Minimal initial number of buckets.
* @param __hf A hash functor. * @param __hf A hash functor.
* @param __eql A key equality functor. * @param __eql A key equality functor.
* @param __a An allocator object. * @param __a An allocator object.
*/ */
explicit explicit
unordered_map(size_type __n = 10, unordered_map(size_type __n,
const hasher& __hf = hasher(), const hasher& __hf = hasher(),
const key_equal& __eql = key_equal(), const key_equal& __eql = key_equal(),
const allocator_type& __a = allocator_type()) const allocator_type& __a = allocator_type())
...@@ -840,15 +843,18 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -840,15 +843,18 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
//construct/destroy/copy //construct/destroy/copy
/// Default constructor.
unordered_multimap() = default;
/** /**
* @brief Default constructor creates no elements. * @brief Default constructor creates no elements.
* @param __n Initial number of buckets. * @param __n Mnimal initial number of buckets.
* @param __hf A hash functor. * @param __hf A hash functor.
* @param __eql A key equality functor. * @param __eql A key equality functor.
* @param __a An allocator object. * @param __a An allocator object.
*/ */
explicit explicit
unordered_multimap(size_type __n = 10, unordered_multimap(size_type __n,
const hasher& __hf = hasher(), const hasher& __hf = hasher(),
const key_equal& __eql = key_equal(), const key_equal& __eql = key_equal(),
const allocator_type& __a = allocator_type()) const allocator_type& __a = allocator_type())
......
...@@ -121,15 +121,19 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -121,15 +121,19 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
//@} //@}
// construct/destroy/copy // construct/destroy/copy
/// Default constructor.
unordered_set() = default;
/** /**
* @brief Default constructor creates no elements. * @brief Default constructor creates no elements.
* @param __n Initial number of buckets. * @param __n Minimal initial number of buckets.
* @param __hf A hash functor. * @param __hf A hash functor.
* @param __eql A key equality functor. * @param __eql A key equality functor.
* @param __a An allocator object. * @param __a An allocator object.
*/ */
explicit explicit
unordered_set(size_type __n = 10, unordered_set(size_type __n,
const hasher& __hf = hasher(), const hasher& __hf = hasher(),
const key_equal& __eql = key_equal(), const key_equal& __eql = key_equal(),
const allocator_type& __a = allocator_type()) const allocator_type& __a = allocator_type())
...@@ -756,15 +760,19 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -756,15 +760,19 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
//@} //@}
// construct/destroy/copy // construct/destroy/copy
/// Default constructor.
unordered_multiset() = default;
/** /**
* @brief Default constructor creates no elements. * @brief Default constructor creates no elements.
* @param __n Initial number of buckets. * @param __n Minimal initial number of buckets.
* @param __hf A hash functor. * @param __hf A hash functor.
* @param __eql A key equality functor. * @param __eql A key equality functor.
* @param __a An allocator object. * @param __a An allocator object.
*/ */
explicit explicit
unordered_multiset(size_type __n = 10, unordered_multiset(size_type __n,
const hasher& __hf = hasher(), const hasher& __hf = hasher(),
const key_equal& __eql = key_equal(), const key_equal& __eql = key_equal(),
const allocator_type& __a = allocator_type()) const allocator_type& __a = allocator_type())
......
...@@ -82,8 +82,10 @@ namespace __debug ...@@ -82,8 +82,10 @@ namespace __debug
typedef __gnu_debug::_Safe_local_iterator< typedef __gnu_debug::_Safe_local_iterator<
_Base_const_local_iterator, unordered_map> const_local_iterator; _Base_const_local_iterator, unordered_map> const_local_iterator;
unordered_map() = default;
explicit explicit
unordered_map(size_type __n = 10, unordered_map(size_type __n,
const hasher& __hf = hasher(), const hasher& __hf = hasher(),
const key_equal& __eql = key_equal(), const key_equal& __eql = key_equal(),
const allocator_type& __a = allocator_type()) const allocator_type& __a = allocator_type())
...@@ -495,8 +497,10 @@ namespace __debug ...@@ -495,8 +497,10 @@ namespace __debug
typedef __gnu_debug::_Safe_local_iterator< typedef __gnu_debug::_Safe_local_iterator<
_Base_const_local_iterator, unordered_multimap> const_local_iterator; _Base_const_local_iterator, unordered_multimap> const_local_iterator;
unordered_multimap() = default;
explicit explicit
unordered_multimap(size_type __n = 10, unordered_multimap(size_type __n,
const hasher& __hf = hasher(), const hasher& __hf = hasher(),
const key_equal& __eql = key_equal(), const key_equal& __eql = key_equal(),
const allocator_type& __a = allocator_type()) const allocator_type& __a = allocator_type())
......
...@@ -82,8 +82,10 @@ namespace __debug ...@@ -82,8 +82,10 @@ namespace __debug
typedef __gnu_debug::_Safe_local_iterator< typedef __gnu_debug::_Safe_local_iterator<
_Base_const_local_iterator, unordered_set> const_local_iterator; _Base_const_local_iterator, unordered_set> const_local_iterator;
unordered_set() = default;
explicit explicit
unordered_set(size_type __n = 10, unordered_set(size_type __n,
const hasher& __hf = hasher(), const hasher& __hf = hasher(),
const key_equal& __eql = key_equal(), const key_equal& __eql = key_equal(),
const allocator_type& __a = allocator_type()) const allocator_type& __a = allocator_type())
...@@ -491,8 +493,10 @@ namespace __debug ...@@ -491,8 +493,10 @@ namespace __debug
typedef __gnu_debug::_Safe_local_iterator< typedef __gnu_debug::_Safe_local_iterator<
_Base_const_local_iterator, unordered_multiset> const_local_iterator; _Base_const_local_iterator, unordered_multiset> const_local_iterator;
unordered_multiset() = default;
explicit explicit
unordered_multiset(size_type __n = 10, unordered_multiset(size_type __n,
const hasher& __hf = hasher(), const hasher& __hf = hasher(),
const key_equal& __eql = key_equal(), const key_equal& __eql = key_equal(),
const allocator_type& __a = allocator_type()) const allocator_type& __a = allocator_type())
......
...@@ -76,3 +76,10 @@ void test03() ...@@ -76,3 +76,10 @@ void test03()
static_assert( noexcept( v1 = std::move(v2) ), "Move assign cannot throw" ); static_assert( noexcept( v1 = std::move(v2) ), "Move assign cannot throw" );
static_assert( !noexcept( v1.swap(v2) ), "Swap can throw" ); static_assert( !noexcept( v1.swap(v2) ), "Swap can throw" );
} }
void test04()
{
typedef std::unordered_map<int, int> test_type;
static_assert( noexcept( test_type() ), "Default constructor do not throw" );
static_assert( noexcept( test_type(test_type()) ), "Move constructor do not throw" );
}
...@@ -76,3 +76,10 @@ void test03() ...@@ -76,3 +76,10 @@ void test03()
static_assert( noexcept( v1 = std::move(v2) ), "Move assign cannot throw" ); static_assert( noexcept( v1 = std::move(v2) ), "Move assign cannot throw" );
static_assert( !noexcept( v1.swap(v2) ), "Swap can throw" ); static_assert( !noexcept( v1.swap(v2) ), "Swap can throw" );
} }
void test04()
{
typedef std::unordered_multimap<int, int> test_type;
static_assert( noexcept( test_type() ), "Default constructor do not throw" );
static_assert( noexcept( test_type(test_type()) ), "Move constructor do not throw" );
}
...@@ -76,3 +76,10 @@ void test03() ...@@ -76,3 +76,10 @@ void test03()
static_assert( noexcept( v1 = std::move(v2) ), "Move assign cannot throw" ); static_assert( noexcept( v1 = std::move(v2) ), "Move assign cannot throw" );
static_assert( !noexcept( v1.swap(v2) ), "Swap can throw" ); static_assert( !noexcept( v1.swap(v2) ), "Swap can throw" );
} }
void test04()
{
typedef std::unordered_multiset<int> test_type;
static_assert( noexcept( test_type() ), "Default constructor do not throw" );
static_assert( noexcept( test_type(test_type()) ), "Move constructor do not throw" );
}
...@@ -76,3 +76,10 @@ void test03() ...@@ -76,3 +76,10 @@ void test03()
static_assert( noexcept( v1 = std::move(v2) ), "Move assign cannot throw" ); static_assert( noexcept( v1 = std::move(v2) ), "Move assign cannot throw" );
static_assert( !noexcept( v1.swap(v2) ), "Swap can throw" ); static_assert( !noexcept( v1.swap(v2) ), "Swap can throw" );
} }
void test04()
{
typedef std::unordered_set<int> test_type;
static_assert( noexcept( test_type() ), "Default constructor do not throw" );
static_assert( noexcept( test_type(test_type()) ), "Move constructor do not throw" );
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment