186 :
public __pair_base<_T1, _T2>
194#if __cplusplus >= 201103L
221#if __cpp_lib_concepts
229 requires is_default_constructible_v<_T1>
230 && is_default_constructible_v<_T2>
237 template<
typename _U1,
typename _U2>
238 static constexpr bool
241 if constexpr (is_constructible_v<_T1, _U1>)
242 return is_constructible_v<_T2, _U2>;
246 template<
typename _U1,
typename _U2>
247 static constexpr bool
248 _S_nothrow_constructible()
250 if constexpr (is_nothrow_constructible_v<_T1, _U1>)
251 return is_nothrow_constructible_v<_T2, _U2>;
255 template<
typename _U1,
typename _U2>
256 static constexpr bool
259 if constexpr (is_convertible_v<_U1, _T1>)
260 return is_convertible_v<_U2, _T2>;
268 constexpr explicit(!_S_convertible<const _T1&, const _T2&>())
269 pair(
const _T1& __x,
const _T2& __y)
270 noexcept(_S_nothrow_constructible<const _T1&, const _T2&>())
271 requires (_S_constructible<const _T1&, const _T2&>())
276 template<
typename _U1,
typename _U2>
277 requires (_S_constructible<_U1, _U2>())
278 constexpr explicit(!_S_convertible<_U1, _U2>())
279 pair(_U1&& __x, _U2&& __y)
280 noexcept(_S_nothrow_constructible<_U1, _U2>())
285 template<
typename _U1,
typename _U2>
286 requires (_S_constructible<const _U1&, const _U2&>())
287 constexpr explicit(!_S_convertible<const _U1&, const _U2&>())
288 pair(
const pair<_U1, _U2>& __p)
289 noexcept(_S_nothrow_constructible<const _U1&, const _U2&>())
294 template<
typename _U1,
typename _U2>
295 requires (_S_constructible<_U1, _U2>())
296 constexpr explicit(!_S_convertible<_U1, _U2>())
297 pair(pair<_U1, _U2>&& __p)
298 noexcept(_S_nothrow_constructible<_U1, _U2>())
305 template<
typename _U1,
typename _U2>
306 static constexpr bool
309 if constexpr (is_assignable_v<_T1&, _U1>)
310 return is_assignable_v<_T2&, _U2>;
314 template<
typename _U1,
typename _U2>
315 static constexpr bool
316 _S_nothrow_assignable()
318 if constexpr (is_nothrow_assignable_v<_T1&, _U1>)
319 return is_nothrow_assignable_v<_T2&, _U2>;
326 pair& operator=(
const pair&) =
delete;
330 operator=(
const pair& __p)
331 noexcept(_S_nothrow_assignable<const _T1&, const _T2&>())
332 requires (_S_assignable<const _T1&, const _T2&>())
341 operator=(
pair&& __p)
342 noexcept(_S_nothrow_assignable<_T1, _T2>())
343 requires (_S_assignable<_T1, _T2>())
351 template<
typename _U1,
typename _U2>
353 operator=(
const pair<_U1, _U2>& __p)
354 noexcept(_S_nothrow_assignable<const _U1&, const _U2&>())
355 requires (_S_assignable<const _U1&, const _U2&>())
363 template<
typename _U1,
typename _U2>
365 operator=(pair<_U1, _U2>&& __p)
366 noexcept(_S_nothrow_assignable<_U1, _U2>())
367 requires (_S_assignable<_U1, _U2>())
378 template <
typename _U1 = _T1,
380 typename enable_if<__and_<
381 __is_implicitly_default_constructible<_U1>,
382 __is_implicitly_default_constructible<_U2>>
383 ::value,
bool>::type =
true>
387 template <
typename _U1 = _T1,
395 ::value,
bool>::type =
false>
396 explicit constexpr pair()
401 using _PCCP = _PCC<true, _T1, _T2>;
405 template<
typename _U1 = _T1,
typename _U2=_T2,
typename
406 enable_if<_PCCP::template
407 _ConstructiblePair<_U1, _U2>()
409 _ImplicitlyConvertiblePair<_U1, _U2>(),
411 constexpr pair(
const _T1& __a,
const _T2& __b)
415 template<
typename _U1 = _T1,
typename _U2=_T2,
typename
421 explicit constexpr pair(
const _T1& __a,
const _T2& __b)
426 template <
typename _U1,
typename _U2>
432 template<
typename _U1,
typename _U2,
typename
441 template<
typename _U1,
typename _U2,
typename
442 enable_if<_PCCFP<_U1, _U2>::template
443 _ConstructiblePair<_U1, _U2>()
444 && !_PCCFP<_U1, _U2>::template
445 _ImplicitlyConvertiblePair<_U1, _U2>(),
447 explicit constexpr pair(
const pair<_U1, _U2>& __p)
450#if _GLIBCXX_USE_DEPRECATED
451#if defined(__DEPRECATED)
452# define _GLIBCXX_DEPRECATED_PAIR_CTOR \
453 __attribute__ ((__deprecated__ ("use 'nullptr' instead of '0' to " \
454 "initialize std::pair of move-only " \
455 "type and pointer")))
457# define _GLIBCXX_DEPRECATED_PAIR_CTOR
464 struct __zero_as_null_pointer_constant
466 __zero_as_null_pointer_constant(
int __zero_as_null_pointer_constant::*)
468 template<
typename _Tp,
469 typename = __enable_if_t<is_null_pointer<_Tp>::value>>
470 __zero_as_null_pointer_constant(_Tp) =
delete;
478 template<
typename _U1,
479 __enable_if_t<__and_<__not_<is_reference<_U1>>,
481 is_constructible<_T1, _U1>,
482 __not_<is_constructible<_T1, const _U1&>>,
483 is_convertible<_U1, _T1>>::value,
485 _GLIBCXX_DEPRECATED_PAIR_CTOR
487 pair(_U1&& __x, __zero_as_null_pointer_constant, ...)
490 template<
typename _U1,
491 __enable_if_t<__and_<__not_<is_reference<_U1>>,
493 is_constructible<_T1, _U1>,
494 __not_<is_constructible<_T1, const _U1&>>,
495 __not_<is_convertible<_U1, _T1>>>::value,
497 _GLIBCXX_DEPRECATED_PAIR_CTOR
499 pair(_U1&& __x, __zero_as_null_pointer_constant, ...)
502 template<
typename _U2,
503 __enable_if_t<__and_<is_pointer<_T1>,
504 __not_<is_reference<_U2>>,
505 is_constructible<_T2, _U2>,
506 __not_<is_constructible<_T2, const _U2&>>,
507 is_convertible<_U2, _T2>>::value,
509 _GLIBCXX_DEPRECATED_PAIR_CTOR
511 pair(__zero_as_null_pointer_constant, _U2&& __y, ...)
514 template<
typename _U2,
515 __enable_if_t<__and_<is_pointer<_T1>,
516 __not_<is_reference<_U2>>,
517 is_constructible<_T2, _U2>,
518 __not_<is_constructible<_T2, const _U2&>>,
519 __not_<is_convertible<_U2, _T2>>>::value,
521 _GLIBCXX_DEPRECATED_PAIR_CTOR
523 pair(__zero_as_null_pointer_constant, _U2&& __y, ...)
525#undef _GLIBCXX_DEPRECATED_PAIR_CTOR
528 template<
typename _U1,
typename _U2,
typename
529 enable_if<_PCCP::template
530 _MoveConstructiblePair<_U1, _U2>()
532 _ImplicitlyMoveConvertiblePair<_U1, _U2>(),
534 constexpr pair(_U1&& __x, _U2&& __y)
537 template<
typename _U1,
typename _U2,
typename
538 enable_if<_PCCP::template
539 _MoveConstructiblePair<_U1, _U2>()
541 _ImplicitlyMoveConvertiblePair<_U1, _U2>(),
543 explicit constexpr pair(_U1&& __x, _U2&& __y)
547 template<
typename _U1,
typename _U2,
typename
548 enable_if<_PCCFP<_U1, _U2>::template
549 _MoveConstructiblePair<_U1, _U2>()
550 && _PCCFP<_U1, _U2>::template
551 _ImplicitlyMoveConvertiblePair<_U1, _U2>(),
553 constexpr pair(pair<_U1, _U2>&& __p)
557 template<
typename _U1,
typename _U2,
typename
558 enable_if<_PCCFP<_U1, _U2>::template
559 _MoveConstructiblePair<_U1, _U2>()
560 && !_PCCFP<_U1, _U2>::template
561 _ImplicitlyMoveConvertiblePair<_U1, _U2>(),
563 explicit constexpr pair(pair<_U1, _U2>&& __p)
568 operator=(__conditional_t<__and_<is_copy_assignable<_T1>,
569 is_copy_assignable<_T2>>::value,
570 const pair&,
const __nonesuch&> __p)
578 operator=(__conditional_t<__and_<is_move_assignable<_T1>,
579 is_move_assignable<_T2>>::value,
580 pair&&, __nonesuch&&> __p)
581 noexcept(__and_<is_nothrow_move_assignable<_T1>,
582 is_nothrow_move_assignable<_T2>>::value)
589 template<
typename _U1,
typename _U2>
590 typename enable_if<__and_<is_assignable<_T1&, const _U1&>,
591 is_assignable<_T2&, const _U2&>>::value,
593 operator=(
const pair<_U1, _U2>& __p)
600 template<
typename _U1,
typename _U2>
601 typename enable_if<__and_<is_assignable<_T1&, _U1&&>,
602 is_assignable<_T2&, _U2&&>>::value,
604 operator=(pair<_U1, _U2>&& __p)
621 pair(
const _T1& __a,
const _T2& __b)
625 template<
typename _U1,
typename _U2>
626 pair(
const pair<_U1, _U2>& __p)