188 :
public __pair_base<_T1, _T2>
196#if __cplusplus >= 201103L
223#if __cpp_lib_concepts
231 requires is_default_constructible_v<_T1>
232 && is_default_constructible_v<_T2>
239 template<
typename _U1,
typename _U2>
240 static constexpr bool
243 if constexpr (is_constructible_v<_T1, _U1>)
244 return is_constructible_v<_T2, _U2>;
248 template<
typename _U1,
typename _U2>
249 static constexpr bool
250 _S_nothrow_constructible()
252 if constexpr (is_nothrow_constructible_v<_T1, _U1>)
253 return is_nothrow_constructible_v<_T2, _U2>;
257 template<
typename _U1,
typename _U2>
258 static constexpr bool
261 if constexpr (is_convertible_v<_U1, _T1>)
262 return is_convertible_v<_U2, _T2>;
270 constexpr explicit(!_S_convertible<const _T1&, const _T2&>())
271 pair(
const _T1& __x,
const _T2& __y)
272 noexcept(_S_nothrow_constructible<const _T1&, const _T2&>())
273 requires (_S_constructible<const _T1&, const _T2&>())
278 template<
typename _U1,
typename _U2>
279 requires (_S_constructible<_U1, _U2>())
280 constexpr explicit(!_S_convertible<_U1, _U2>())
281 pair(_U1&& __x, _U2&& __y)
282 noexcept(_S_nothrow_constructible<_U1, _U2>())
287 template<
typename _U1,
typename _U2>
288 requires (_S_constructible<const _U1&, const _U2&>())
289 constexpr explicit(!_S_convertible<const _U1&, const _U2&>())
290 pair(
const pair<_U1, _U2>& __p)
291 noexcept(_S_nothrow_constructible<const _U1&, const _U2&>())
296 template<
typename _U1,
typename _U2>
297 requires (_S_constructible<_U1, _U2>())
298 constexpr explicit(!_S_convertible<_U1, _U2>())
299 pair(pair<_U1, _U2>&& __p)
300 noexcept(_S_nothrow_constructible<_U1, _U2>())
307 template<
typename _U1,
typename _U2>
308 static constexpr bool
311 if constexpr (is_assignable_v<_T1&, _U1>)
312 return is_assignable_v<_T2&, _U2>;
316 template<
typename _U1,
typename _U2>
317 static constexpr bool
318 _S_nothrow_assignable()
320 if constexpr (is_nothrow_assignable_v<_T1&, _U1>)
321 return is_nothrow_assignable_v<_T2&, _U2>;
328 pair& operator=(
const pair&) =
delete;
332 operator=(
const pair& __p)
333 noexcept(_S_nothrow_assignable<const _T1&, const _T2&>())
334 requires (_S_assignable<const _T1&, const _T2&>())
343 operator=(
pair&& __p)
344 noexcept(_S_nothrow_assignable<_T1, _T2>())
345 requires (_S_assignable<_T1, _T2>())
353 template<
typename _U1,
typename _U2>
355 operator=(
const pair<_U1, _U2>& __p)
356 noexcept(_S_nothrow_assignable<const _U1&, const _U2&>())
357 requires (_S_assignable<const _U1&, const _U2&>())
365 template<
typename _U1,
typename _U2>
367 operator=(pair<_U1, _U2>&& __p)
368 noexcept(_S_nothrow_assignable<_U1, _U2>())
369 requires (_S_assignable<_U1, _U2>())
380 template <
typename _U1 = _T1,
382 typename enable_if<__and_<
383 __is_implicitly_default_constructible<_U1>,
384 __is_implicitly_default_constructible<_U2>>
385 ::value,
bool>::type =
true>
389 template <
typename _U1 = _T1,
397 ::value,
bool>::type =
false>
398 explicit constexpr pair()
403 using _PCCP = _PCC<true, _T1, _T2>;
407 template<
typename _U1 = _T1,
typename _U2=_T2,
typename
408 enable_if<_PCCP::template
409 _ConstructiblePair<_U1, _U2>()
411 _ImplicitlyConvertiblePair<_U1, _U2>(),
413 constexpr pair(
const _T1& __a,
const _T2& __b)
417 template<
typename _U1 = _T1,
typename _U2=_T2,
typename
423 explicit constexpr pair(
const _T1& __a,
const _T2& __b)
428 template <
typename _U1,
typename _U2>
434 template<
typename _U1,
typename _U2,
typename
443 template<
typename _U1,
typename _U2,
typename
444 enable_if<_PCCFP<_U1, _U2>::template
445 _ConstructiblePair<_U1, _U2>()
446 && !_PCCFP<_U1, _U2>::template
447 _ImplicitlyConvertiblePair<_U1, _U2>(),
449 explicit constexpr pair(
const pair<_U1, _U2>& __p)
452#if _GLIBCXX_USE_DEPRECATED
453#if defined(__DEPRECATED)
454# define _GLIBCXX_DEPRECATED_PAIR_CTOR \
455 __attribute__ ((__deprecated__ ("use 'nullptr' instead of '0' to " \
456 "initialize std::pair of move-only " \
457 "type and pointer")))
459# define _GLIBCXX_DEPRECATED_PAIR_CTOR
466 struct __zero_as_null_pointer_constant
468 __zero_as_null_pointer_constant(
int __zero_as_null_pointer_constant::*)
470 template<
typename _Tp,
471 typename = __enable_if_t<is_null_pointer<_Tp>::value>>
472 __zero_as_null_pointer_constant(_Tp) =
delete;
480 template<
typename _U1,
481 __enable_if_t<__and_<__not_<is_reference<_U1>>,
483 is_constructible<_T1, _U1>,
484 __not_<is_constructible<_T1, const _U1&>>,
485 is_convertible<_U1, _T1>>::value,
487 _GLIBCXX_DEPRECATED_PAIR_CTOR
489 pair(_U1&& __x, __zero_as_null_pointer_constant, ...)
492 template<
typename _U1,
493 __enable_if_t<__and_<__not_<is_reference<_U1>>,
495 is_constructible<_T1, _U1>,
496 __not_<is_constructible<_T1, const _U1&>>,
497 __not_<is_convertible<_U1, _T1>>>::value,
499 _GLIBCXX_DEPRECATED_PAIR_CTOR
501 pair(_U1&& __x, __zero_as_null_pointer_constant, ...)
504 template<
typename _U2,
505 __enable_if_t<__and_<is_pointer<_T1>,
506 __not_<is_reference<_U2>>,
507 is_constructible<_T2, _U2>,
508 __not_<is_constructible<_T2, const _U2&>>,
509 is_convertible<_U2, _T2>>::value,
511 _GLIBCXX_DEPRECATED_PAIR_CTOR
513 pair(__zero_as_null_pointer_constant, _U2&& __y, ...)
516 template<
typename _U2,
517 __enable_if_t<__and_<is_pointer<_T1>,
518 __not_<is_reference<_U2>>,
519 is_constructible<_T2, _U2>,
520 __not_<is_constructible<_T2, const _U2&>>,
521 __not_<is_convertible<_U2, _T2>>>::value,
523 _GLIBCXX_DEPRECATED_PAIR_CTOR
525 pair(__zero_as_null_pointer_constant, _U2&& __y, ...)
527#undef _GLIBCXX_DEPRECATED_PAIR_CTOR
530 template<
typename _U1,
typename _U2,
typename
531 enable_if<_PCCP::template
532 _MoveConstructiblePair<_U1, _U2>()
534 _ImplicitlyMoveConvertiblePair<_U1, _U2>(),
536 constexpr pair(_U1&& __x, _U2&& __y)
539 template<
typename _U1,
typename _U2,
typename
540 enable_if<_PCCP::template
541 _MoveConstructiblePair<_U1, _U2>()
543 _ImplicitlyMoveConvertiblePair<_U1, _U2>(),
545 explicit constexpr pair(_U1&& __x, _U2&& __y)
549 template<
typename _U1,
typename _U2,
typename
550 enable_if<_PCCFP<_U1, _U2>::template
551 _MoveConstructiblePair<_U1, _U2>()
552 && _PCCFP<_U1, _U2>::template
553 _ImplicitlyMoveConvertiblePair<_U1, _U2>(),
555 constexpr pair(pair<_U1, _U2>&& __p)
559 template<
typename _U1,
typename _U2,
typename
560 enable_if<_PCCFP<_U1, _U2>::template
561 _MoveConstructiblePair<_U1, _U2>()
562 && !_PCCFP<_U1, _U2>::template
563 _ImplicitlyMoveConvertiblePair<_U1, _U2>(),
565 explicit constexpr pair(pair<_U1, _U2>&& __p)
570 operator=(__conditional_t<__and_<is_copy_assignable<_T1>,
571 is_copy_assignable<_T2>>::value,
572 const pair&,
const __nonesuch&> __p)
580 operator=(__conditional_t<__and_<is_move_assignable<_T1>,
581 is_move_assignable<_T2>>::value,
582 pair&&, __nonesuch&&> __p)
583 noexcept(__and_<is_nothrow_move_assignable<_T1>,
584 is_nothrow_move_assignable<_T2>>::value)
591 template<
typename _U1,
typename _U2>
592 typename enable_if<__and_<is_assignable<_T1&, const _U1&>,
593 is_assignable<_T2&, const _U2&>>::value,
595 operator=(
const pair<_U1, _U2>& __p)
602 template<
typename _U1,
typename _U2>
603 typename enable_if<__and_<is_assignable<_T1&, _U1&&>,
604 is_assignable<_T2&, _U2&&>>::value,
606 operator=(pair<_U1, _U2>&& __p)
623 pair(
const _T1& __a,
const _T2& __b)
627 template<
typename _U1,
typename _U2>
628 pair(
const pair<_U1, _U2>& __p)