@@ -51,16 +51,16 @@ namespace std {
51
51
52
52
// 20.7.2.4, modifiers
53
53
template <class T, class... Args>
54
- void emplace(Args&&...);
54
+ T& emplace(Args&&...);
55
55
56
56
template <class T, class U, class... Args>
57
- void emplace(initializer_list<U>, Args&&...);
57
+ T& emplace(initializer_list<U>, Args&&...);
58
58
59
59
template <size_t I, class... Args>
60
- void emplace(Args&&...);
60
+ variant_alternative<I, variant>& emplace(Args&&...);
61
61
62
62
template <size_t I, class U, class... Args>
63
- void emplace(initializer_list<U>, Args&&...);
63
+ variant_alternative<I, variant>& emplace(initializer_list<U>, Args&&...);
64
64
65
65
// 20.7.2.5, value status
66
66
constexpr bool valueless_by_exception() const noexcept;
@@ -732,9 +732,10 @@ namespace mpark {
732
732
733
733
protected:
734
734
template <std::size_t I, typename T, typename ... Args>
735
- inline static void construct_alt (alt<I, T> &a, Args &&... args) {
735
+ inline static T & construct_alt (alt<I, T> &a, Args &&... args) {
736
736
::new (static_cast <void *>(lib::addressof (a)))
737
737
alt<I, T>(in_place, std::forward<Args>(args)...);
738
+ return a.value_ ;
738
739
}
739
740
740
741
template <typename Rhs>
@@ -838,11 +839,12 @@ namespace mpark {
838
839
using super::operator =;
839
840
840
841
template <std::size_t I, typename ... Args>
841
- inline void emplace (Args &&... args) {
842
+ inline auto & emplace (Args &&... args) {
842
843
this ->destroy ();
843
- this ->construct_alt (access::base::get_alt<I>(*this ),
844
- std::forward<Args>(args)...);
844
+ auto &result = this ->construct_alt (access::base::get_alt<I>(*this ),
845
+ std::forward<Args>(args)...);
845
846
this ->index_ = I;
847
+ return result;
846
848
}
847
849
848
850
protected:
@@ -1162,8 +1164,8 @@ namespace mpark {
1162
1164
typename ... Args,
1163
1165
typename T = lib::type_pack_element_t <I, Ts...>,
1164
1166
std::enable_if_t <std::is_constructible<T, Args...>::value, int > = 0 >
1165
- inline void emplace (Args &&... args) {
1166
- impl_.template emplace <I>(std::forward<Args>(args)...);
1167
+ inline T & emplace (Args &&... args) {
1168
+ return impl_.template emplace <I>(std::forward<Args>(args)...);
1167
1169
}
1168
1170
1169
1171
template <
@@ -1175,17 +1177,17 @@ namespace mpark {
1175
1177
std::initializer_list<Up> &,
1176
1178
Args...>::value,
1177
1179
int > = 0 >
1178
- inline void emplace (std::initializer_list<Up> il, Args &&... args) {
1179
- impl_.template emplace <I>(il, std::forward<Args>(args)...);
1180
+ inline T & emplace (std::initializer_list<Up> il, Args &&... args) {
1181
+ return impl_.template emplace <I>(il, std::forward<Args>(args)...);
1180
1182
}
1181
1183
1182
1184
template <
1183
1185
typename T,
1184
1186
typename ... Args,
1185
1187
std::size_t I = detail::find_index_sfinae<T, Ts...>::value,
1186
1188
std::enable_if_t <std::is_constructible<T, Args...>::value, int > = 0 >
1187
- inline void emplace (Args &&... args) {
1188
- impl_.template emplace <I>(std::forward<Args>(args)...);
1189
+ inline T & emplace (Args &&... args) {
1190
+ return impl_.template emplace <I>(std::forward<Args>(args)...);
1189
1191
}
1190
1192
1191
1193
template <
@@ -1197,8 +1199,8 @@ namespace mpark {
1197
1199
std::initializer_list<Up> &,
1198
1200
Args...>::value,
1199
1201
int > = 0 >
1200
- inline void emplace (std::initializer_list<Up> il, Args &&... args) {
1201
- impl_.template emplace <I>(il, std::forward<Args>(args)...);
1202
+ inline T & emplace (std::initializer_list<Up> il, Args &&... args) {
1203
+ return impl_.template emplace <I>(il, std::forward<Args>(args)...);
1202
1204
}
1203
1205
1204
1206
inline constexpr bool valueless_by_exception () const noexcept {
0 commit comments