@@ -586,8 +586,7 @@ struct _Atomic_storage {
586586
587587 _Atomic_storage() = default;
588588
589- /* implicit */ constexpr _Atomic_storage(conditional_t<is_reference_v<_Ty>, _Ty, const _TVal> _Value) noexcept
590- : _Storage(_Value) {
589+ /* implicit */ constexpr _Atomic_storage(const _Ty& _Value) noexcept : _Storage(_Value) {
591590 // non-atomically initialize this atomic
592591 }
593592
@@ -714,13 +713,11 @@ public:
714713
715714template <class _Ty>
716715struct _Atomic_storage<_Ty, 1> { // lock-free using 1-byte intrinsics
717-
718716 using _TVal = remove_reference_t<_Ty>;
719717
720718 _Atomic_storage() = default;
721719
722- /* implicit */ constexpr _Atomic_storage(conditional_t<is_reference_v<_Ty>, _Ty, const _TVal> _Value) noexcept
723- : _Storage{_Value} {
720+ /* implicit */ constexpr _Atomic_storage(const _Ty& _Value) noexcept : _Storage{_Value} {
724721 // non-atomically initialize this atomic
725722 }
726723
@@ -817,13 +814,11 @@ struct _Atomic_storage<_Ty, 1> { // lock-free using 1-byte intrinsics
817814
818815template <class _Ty>
819816struct _Atomic_storage<_Ty, 2> { // lock-free using 2-byte intrinsics
820-
821817 using _TVal = remove_reference_t<_Ty>;
822818
823819 _Atomic_storage() = default;
824820
825- /* implicit */ constexpr _Atomic_storage(conditional_t<is_reference_v<_Ty>, _Ty, const _TVal> _Value) noexcept
826- : _Storage{_Value} {
821+ /* implicit */ constexpr _Atomic_storage(const _Ty& _Value) noexcept : _Storage{_Value} {
827822 // non-atomically initialize this atomic
828823 }
829824
@@ -919,13 +914,11 @@ struct _Atomic_storage<_Ty, 2> { // lock-free using 2-byte intrinsics
919914
920915template <class _Ty>
921916struct _Atomic_storage<_Ty, 4> { // lock-free using 4-byte intrinsics
922-
923917 using _TVal = remove_reference_t<_Ty>;
924918
925919 _Atomic_storage() = default;
926920
927- /* implicit */ constexpr _Atomic_storage(conditional_t<is_reference_v<_Ty>, _Ty, const _TVal> _Value) noexcept
928- : _Storage{_Value} {
921+ /* implicit */ constexpr _Atomic_storage(const _Ty& _Value) noexcept : _Storage{_Value} {
929922 // non-atomically initialize this atomic
930923 }
931924
@@ -1021,13 +1014,11 @@ struct _Atomic_storage<_Ty, 4> { // lock-free using 4-byte intrinsics
10211014
10221015template <class _Ty>
10231016struct _Atomic_storage<_Ty, 8> { // lock-free using 8-byte intrinsics
1024-
10251017 using _TVal = remove_reference_t<_Ty>;
10261018
10271019 _Atomic_storage() = default;
10281020
1029- /* implicit */ constexpr _Atomic_storage(conditional_t<is_reference_v<_Ty>, _Ty, const _TVal> _Value) noexcept
1030- : _Storage{_Value} {
1021+ /* implicit */ constexpr _Atomic_storage(const _Ty& _Value) noexcept : _Storage{_Value} {
10311022 // non-atomically initialize this atomic
10321023 }
10331024
@@ -1148,7 +1139,8 @@ struct _Atomic_storage<_Ty&, 16> { // lock-free using 16-byte intrinsics
11481139
11491140 _Atomic_storage() = default;
11501141
1151- /* implicit */ constexpr _Atomic_storage(conditional_t<is_reference_v<_Ty&>, _Ty&, const _TVal> _Value) noexcept
1142+ // TRANSITION, ABI: replace _this_ occurrence of '_Ty&' with 'const _Ty&'
1143+ /* implicit */ constexpr _Atomic_storage(_Ty& _Value) noexcept
11521144 : _Storage{_Value} {} // non-atomically initialize this atomic
11531145
11541146 void store(const _TVal _Value) noexcept { // store with sequential consistency
@@ -2121,10 +2113,11 @@ public:
21212113
21222114 using value_type = _Ty;
21232115
2124- using _Base::_Base;
2125-
2116+ template <class _Uty = _Ty, enable_if_t<is_default_constructible_v<_Uty>, int> = 0>
21262117 constexpr atomic() noexcept(is_nothrow_default_constructible_v<_Ty>) : _Base() {}
21272118
2119+ /* implicit */ constexpr atomic(const _Ty _Value) noexcept : _Base(_Value) {}
2120+
21282121 atomic(const atomic&) = delete;
21292122 atomic& operator=(const atomic&) = delete;
21302123 atomic& operator=(const atomic&) volatile = delete;
0 commit comments