Skip to content

Commit 8805968

Browse files
committed
Implement LWG 2857.
1 parent ae1f248 commit 8805968

File tree

1 file changed

+18
-16
lines changed

1 file changed

+18
-16
lines changed

include/mpark/variant.hpp

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -51,16 +51,16 @@ namespace std {
5151
5252
// 20.7.2.4, modifiers
5353
template <class T, class... Args>
54-
void emplace(Args&&...);
54+
T& emplace(Args&&...);
5555
5656
template <class T, class U, class... Args>
57-
void emplace(initializer_list<U>, Args&&...);
57+
T& emplace(initializer_list<U>, Args&&...);
5858
5959
template <size_t I, class... Args>
60-
void emplace(Args&&...);
60+
variant_alternative<I, variant>& emplace(Args&&...);
6161
6262
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&&...);
6464
6565
// 20.7.2.5, value status
6666
constexpr bool valueless_by_exception() const noexcept;
@@ -732,9 +732,10 @@ namespace mpark {
732732

733733
protected:
734734
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) {
736736
::new (static_cast<void *>(lib::addressof(a)))
737737
alt<I, T>(in_place, std::forward<Args>(args)...);
738+
return a.value_;
738739
}
739740

740741
template <typename Rhs>
@@ -838,11 +839,12 @@ namespace mpark {
838839
using super::operator=;
839840

840841
template <std::size_t I, typename... Args>
841-
inline void emplace(Args &&... args) {
842+
inline auto &emplace(Args &&... args) {
842843
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)...);
845846
this->index_ = I;
847+
return result;
846848
}
847849

848850
protected:
@@ -1162,8 +1164,8 @@ namespace mpark {
11621164
typename... Args,
11631165
typename T = lib::type_pack_element_t<I, Ts...>,
11641166
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)...);
11671169
}
11681170

11691171
template <
@@ -1175,17 +1177,17 @@ namespace mpark {
11751177
std::initializer_list<Up> &,
11761178
Args...>::value,
11771179
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)...);
11801182
}
11811183

11821184
template <
11831185
typename T,
11841186
typename... Args,
11851187
std::size_t I = detail::find_index_sfinae<T, Ts...>::value,
11861188
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)...);
11891191
}
11901192

11911193
template <
@@ -1197,8 +1199,8 @@ namespace mpark {
11971199
std::initializer_list<Up> &,
11981200
Args...>::value,
11991201
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)...);
12021204
}
12031205

12041206
inline constexpr bool valueless_by_exception() const noexcept {

0 commit comments

Comments
 (0)