diff --git a/include/string b/include/string index d1b9a5ea..63713162 100644 --- a/include/string +++ b/include/string @@ -1577,6 +1577,27 @@ private: _NOEXCEPT_(is_nothrow_move_assignable::value); #endif + _LIBCPP_INLINE_VISIBILITY + void + __move_assign_alloc(const basic_string& __str) + _NOEXCEPT_( + !__alloc_traits::propagate_on_container_move_assignment::value || + is_nothrow_move_assignable::value) + {__move_assign_alloc(__str, integral_constant());} + + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(const basic_string& __c, true_type) + _NOEXCEPT_(is_nothrow_move_assignable::value) + { + __alloc() = _VSTD::move(__c.__alloc()); + } + + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(const basic_string& __c, false_type) + _NOEXCEPT + {} + _LIBCPP_INLINE_VISIBILITY static void __swap_alloc(allocator_type& __x, allocator_type& __y) _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || @@ -2120,7 +2141,8 @@ basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, tr { clear(); shrink_to_fit(); - __r_ = _VSTD::move(__str.__r_); + __r_.first() = __str.__r_.first(); + __move_assign_alloc(__str); __str.__zero(); }