@@ -119,8 +119,23 @@ namespace Aws
119
119
} // namespace VariantDebug
120
120
#endif /* defined(AWS_CRT_ENABLE_VARIANT_DEBUG) */
121
121
122
+ template <bool > class DefaultConstructibleVariant ;
123
+
124
+ template <> class DefaultConstructibleVariant <true >
125
+ {
126
+ public:
127
+ explicit DefaultConstructibleVariant (int ) {}
128
+ DefaultConstructibleVariant () = default ;
129
+ };
130
+ template <> class DefaultConstructibleVariant <false >
131
+ {
132
+ public:
133
+ explicit DefaultConstructibleVariant (int ) {}
134
+ DefaultConstructibleVariant () = delete ;
135
+ };
136
+
122
137
/* Depending on the Variant types, this struct either deletes special move members or defaults them. */
123
- template <bool = true > class MovableVariant ;
138
+ template <bool > class MovableVariant ;
124
139
125
140
template <> class MovableVariant <true >
126
141
{
@@ -142,7 +157,7 @@ namespace Aws
142
157
};
143
158
144
159
/* Depending on the Variant types, this struct either deletes special copy members or defaults them. */
145
- template <bool = true > class CopyableVariant ;
160
+ template <bool > class CopyableVariant ;
146
161
147
162
template <> class CopyableVariant <true >
148
163
{
@@ -178,18 +193,17 @@ namespace Aws
178
193
VariantDetail::Checker::HasType<typename std::decay<OtherT>::type, Ts...>::value,
179
194
int >::type;
180
195
196
+ public:
181
197
using FirstAlternative = typename ThisVariantAlternative<0 >::type;
182
198
183
199
static constexpr bool isFirstAlternativeNothrowDefaultConstructible =
184
200
std::is_nothrow_default_constructible<FirstAlternative>::value;
185
201
186
- public:
187
202
using IndexT = VariantDetail::Index::VariantIndex;
188
203
static constexpr std::size_t AlternativeCount = sizeof ...(Ts);
189
204
190
205
VariantImpl () noexcept (isFirstAlternativeNothrowDefaultConstructible)
191
206
{
192
- using FirstAlternative = typename ThisVariantAlternative<0 >::type;
193
207
new (m_storage) FirstAlternative ();
194
208
m_index = 0 ;
195
209
}
@@ -658,7 +672,9 @@ namespace Aws
658
672
* @tparam Ts Types of the variant value.
659
673
*/
660
674
template <typename ... Ts>
661
- class Variant : public VariantDetail ::MovableVariant<Conjunction<std::is_move_constructible<Ts>...>::value>,
675
+ class Variant : public VariantDetail ::DefaultConstructibleVariant<
676
+ VariantDetail::VariantImpl<Ts...>::isFirstAlternativeNothrowDefaultConstructible>,
677
+ public VariantDetail::MovableVariant<Conjunction<std::is_move_constructible<Ts>...>::value>,
662
678
public VariantDetail::CopyableVariant<Conjunction<std::is_copy_constructible<Ts>...>::value>
663
679
{
664
680
/* Copyability and Movability depend only on constructors (copy and move correspondingly) of the
@@ -674,24 +690,33 @@ namespace Aws
674
690
using EnableIfOtherIsThisVariantAlternative = typename std::
675
691
enable_if<VariantDetail::Checker::HasType<typename std::decay<OtherT>::type, Ts...>::value, int >::type;
676
692
693
+ static constexpr bool isFirstAlternativeNothrowDefaultConstructible =
694
+ VariantDetail::VariantImpl<Ts...>::isFirstAlternativeNothrowDefaultConstructible;
695
+
677
696
public:
678
697
using IndexT = VariantDetail::Index::VariantIndex;
679
698
static constexpr std::size_t AlternativeCount = sizeof ...(Ts);
680
699
681
700
Variant () = default ;
682
701
683
- template <typename T, EnableIfOtherIsThisVariantAlternative<T> = 1 > Variant (const T &val) : m_variant(val)
702
+ template <typename T, EnableIfOtherIsThisVariantAlternative<T> = 1 >
703
+ Variant (const T &val)
704
+ : VariantDetail::DefaultConstructibleVariant<isFirstAlternativeNothrowDefaultConstructible>(1 ),
705
+ m_variant (val)
684
706
{
685
707
}
686
708
687
709
template <typename T, EnableIfOtherIsThisVariantAlternative<T> = 1 >
688
- Variant (T &&val) : m_variant(std::forward<T>(val))
710
+ Variant (T &&val)
711
+ : VariantDetail::DefaultConstructibleVariant<isFirstAlternativeNothrowDefaultConstructible>(1 ),
712
+ m_variant (std::forward<T>(val))
689
713
{
690
714
}
691
715
692
716
template <typename T, typename ... Args>
693
717
explicit Variant (Aws::Crt::InPlaceTypeT<T> ipt, Args &&...args)
694
- : m_variant(ipt, std::forward<Args>(args)...)
718
+ : VariantDetail::DefaultConstructibleVariant<isFirstAlternativeNothrowDefaultConstructible>(1 ),
719
+ m_variant(ipt, std::forward<Args>(args)...)
695
720
{
696
721
}
697
722
0 commit comments