libstdc++: Use hidden friends for vector<bool>::reference swap overloads

These swap overloads are non-standard, but are needed to make swap work
for vector<bool>::reference rvalues. They don't need to be called
explicitly, only via ADL, so hide them from normal lookup. This is what
I've proposed as the resolution to LWG 3638.

libstdc++-v3/ChangeLog:

	* include/bits/stl_bvector.h (swap(_Bit_reference, _Bit_reference))
	(swap(_Bit_reference, bool&), swap(bool&, _Bit_reference)):
	Define as hidden friends of _Bit_reference.
This commit is contained in:
Jonathan Wakely 2021-11-11 20:51:15 +00:00
parent ba6e17e78d
commit 59434931fb

View File

@ -125,36 +125,36 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
void
flip() _GLIBCXX_NOEXCEPT
{ *_M_p ^= _M_mask; }
};
#if __cplusplus >= 201103L
_GLIBCXX20_CONSTEXPR
inline void
swap(_Bit_reference __x, _Bit_reference __y) noexcept
{
bool __tmp = __x;
__x = __y;
__y = __tmp;
}
_GLIBCXX20_CONSTEXPR
friend void
swap(_Bit_reference __x, _Bit_reference __y) noexcept
{
bool __tmp = __x;
__x = __y;
__y = __tmp;
}
_GLIBCXX20_CONSTEXPR
inline void
swap(_Bit_reference __x, bool& __y) noexcept
{
bool __tmp = __x;
__x = __y;
__y = __tmp;
}
_GLIBCXX20_CONSTEXPR
friend void
swap(_Bit_reference __x, bool& __y) noexcept
{
bool __tmp = __x;
__x = __y;
__y = __tmp;
}
_GLIBCXX20_CONSTEXPR
inline void
swap(bool& __x, _Bit_reference __y) noexcept
{
bool __tmp = __x;
__x = __y;
__y = __tmp;
}
_GLIBCXX20_CONSTEXPR
friend void
swap(bool& __x, _Bit_reference __y) noexcept
{
bool __tmp = __x;
__x = __y;
__y = __tmp;
}
#endif
};
struct _Bit_iterator_base
: public std::iterator<std::random_access_iterator_tag, bool>