Index: test/std/utilities/variant/variant.variant/variant.mod/emplace_index_args.pass.cpp =================================================================== --- test/std/utilities/variant/variant.variant/variant.mod/emplace_index_args.pass.cpp +++ test/std/utilities/variant/variant.variant/variant.mod/emplace_index_args.pass.cpp @@ -14,7 +14,8 @@ // template class variant; -// template void emplace(Args&&... args); +// template +// variant_alternative_t>& emplace(Args&&... args); #include #include @@ -85,10 +86,14 @@ { using V = std::variant; V v(42); - v.emplace<0>(); + auto& ref1 = v.emplace<0>(); + static_assert(std::is_same_v, ""); assert(std::get<0>(v) == 0); - v.emplace<0>(42); + assert(&ref1 == &std::get<0>(v)); + auto& ref2 = v.emplace<0>(42); + static_assert(std::is_same_v, ""); assert(std::get<0>(v) == 42); + assert(&ref2 == &std::get<0>(v)); } { using V = @@ -96,13 +101,19 @@ const int x = 100; V v(std::in_place_index<0>, -1); // default emplace a value - v.emplace<1>(); + auto& ref1 = v.emplace<1>(); + static_assert(std::is_same_v, ""); assert(std::get<1>(v) == 0); - v.emplace<2>(&x); + assert(&ref1 == &std::get<1>(v)); + auto& ref2 = v.emplace<2>(&x); + static_assert(std::is_same_v, ""); assert(std::get<2>(v) == &x); + assert(&ref2 == &std::get<2>(v)); // emplace with multiple args - v.emplace<4>(3, 'a'); + auto& ref3 = v.emplace<4>(3, 'a'); + static_assert(std::is_same_v, ""); assert(std::get<4>(v) == "aaa"); + assert(&ref3 == &std::get<4>(v)); } #if !defined(TEST_VARIANT_HAS_NO_REFERENCES) { @@ -113,20 +124,30 @@ int z = 43; V v(std::in_place_index<0>, -1); // default emplace a value - v.emplace<1>(); + auto& ref1 = v.emplace<1>(); + static_assert(std::is_same_v, ""); assert(std::get<1>(v) == 0); + assert(&ref1 == &std::get<1>(v)); // emplace a reference - v.emplace<2>(x); + auto& ref2 = v.emplace<2>(x); + static_assert(std::is_same_v<&, decltype(ref)>, ""); assert(&std::get<2>(v) == &x); + assert(&ref2 == &std::get<2>(v)); // emplace an rvalue reference - v.emplace<3>(std::move(y)); + auto& ref3 = v.emplace<3>(std::move(y)); + static_assert(std::is_same_v<&, decltype(ref)>, ""); assert(&std::get<3>(v) == &y); + assert(&ref3 == &std::get<3>(v)); // re-emplace a new reference over the active member - v.emplace<3>(std::move(z)); + auto& ref4 = v.emplace<3>(std::move(z)); + static_assert(std::is_same_v<&, decltype(ref)>, ""); assert(&std::get<3>(v) == &z); + assert(&ref4 == &std::get<3>(v)); // emplace with multiple args - v.emplace<5>(3, 'a'); + auto& ref5 = v.emplace<5>(3, 'a'); + static_assert(std::is_same_v, ""); assert(std::get<5>(v) == "aaa"); + assert(&ref5 == &std::get<5>(v)); } #endif } Index: test/std/utilities/variant/variant.variant/variant.mod/emplace_index_init_list_args.pass.cpp =================================================================== --- test/std/utilities/variant/variant.variant/variant.mod/emplace_index_init_list_args.pass.cpp +++ test/std/utilities/variant/variant.variant/variant.mod/emplace_index_init_list_args.pass.cpp @@ -15,7 +15,7 @@ // template class variant; // template -// void emplace(initializer_list il,Args&&... args); +// variant_alternative_t>& emplace(initializer_list il,Args&&... args); #include #include @@ -70,13 +70,19 @@ void test_basic() { using V = std::variant; V v; - v.emplace<1>({1, 2, 3}); + auto& ref1 = v.emplace<1>({1, 2, 3}); + static_assert(std::is_same_v, ""); assert(std::get<1>(v).size == 3); - v.emplace<2>({1, 2, 3, 4}, 42); + assert(&ref1 == &std::get<1>(v)); + auto& ref2 = v.emplace<2>({1, 2, 3, 4}, 42); + static_assert(std::is_same_v, ""); assert(std::get<2>(v).size == 4); assert(std::get<2>(v).value == 42); - v.emplace<1>({1}); + assert(&ref2 == &std::get<2>(v)); + auto& ref3 = v.emplace<1>({1}); + static_assert(std::is_same_v, ""); assert(std::get<1>(v).size == 1); + assert(&ref3 == &std::get<1>(v)); } int main() { Index: test/std/utilities/variant/variant.variant/variant.mod/emplace_type_args.pass.cpp =================================================================== --- test/std/utilities/variant/variant.variant/variant.mod/emplace_type_args.pass.cpp +++ test/std/utilities/variant/variant.variant/variant.mod/emplace_type_args.pass.cpp @@ -14,7 +14,7 @@ // template class variant; -// template void emplace(Args&&... args); +// template T& emplace(Args&&... args); #include #include @@ -86,10 +86,14 @@ { using V = std::variant; V v(42); - v.emplace(); + auto& ref1 = v.emplace(); + static_assert(std::is_same_v, ""); assert(std::get<0>(v) == 0); - v.emplace(42); + assert(&ref1 == &std::get<0>(v)); + auto& ref2 = v.emplace(42); + static_assert(std::is_same_v, ""); assert(std::get<0>(v) == 42); + assert(&ref2 == &std::get<0>(v)); } { using V = @@ -97,13 +101,19 @@ const int x = 100; V v(std::in_place_type, -1); // default emplace a value - v.emplace(); + auto& ref1 = v.emplace(); + static_assert(std::is_same_v, ""); assert(std::get<1>(v) == 0); - v.emplace(&x); + assert(&ref1 == &std::get<1>(v)); + auto& ref2 = v.emplace(&x); + static_assert(std::is_same_v, ""); assert(std::get<2>(v) == &x); + assert(&ref2 == &std::get<2>(v)); // emplace with multiple args - v.emplace(3, 'a'); + auto& ref3 = v.emplace(3, 'a'); + static_assert(std::is_same_v, ""); assert(std::get<4>(v) == "aaa"); + assert(&ref3 == &std::get<4>(v)); } #if !defined(TEST_VARIANT_HAS_NO_REFERENCES) { @@ -114,20 +124,30 @@ int z = 43; V v(std::in_place_index<0>, -1); // default emplace a value - v.emplace(); + auto& ref1 = v.emplace(); + static_assert(std::is_same_v, ""); assert(std::get(v) == 0); + assert(&ref1 == &std::get(v)); // emplace a reference - v.emplace(x); + auto& ref2 = v.emplace(x); + static_assert(std::is_same_v, ""); assert(&std::get(v) == &x); + assert(&ref2 == &std::get(v)); // emplace an rvalue reference - v.emplace(std::move(y)); + auto& ref3 = v.emplace(std::move(y)); + static_assert(std::is_same_v, ""); assert(&std::get(v) == &y); + assert(&ref3 == &std::get(v)); // re-emplace a new reference over the active member - v.emplace(std::move(z)); + auto& ref4 = v.emplace(std::move(z)); + static_assert(std::is_same_v, ""); assert(&std::get(v) == &z); + assert(&ref4 == &std::get(v)); // emplace with multiple args - v.emplace(3, 'a'); + auto& ref5 = v.emplace(3, 'a'); + static_assert(std::is_same_v, ""); assert(std::get(v) == "aaa"); + assert(&ref5 == &std::get(v)); } #endif } Index: test/std/utilities/variant/variant.variant/variant.mod/emplace_type_init_list_args.pass.cpp =================================================================== --- test/std/utilities/variant/variant.variant/variant.mod/emplace_type_init_list_args.pass.cpp +++ test/std/utilities/variant/variant.variant/variant.mod/emplace_type_init_list_args.pass.cpp @@ -15,7 +15,7 @@ // template class variant; // template -// void emplace(initializer_list il,Args&&... args); +// T& emplace(initializer_list il,Args&&... args); #include #include @@ -70,13 +70,19 @@ void test_basic() { using V = std::variant; V v; - v.emplace({1, 2, 3}); + auto& ref1 = v.emplace({1, 2, 3}); + static_assert(std::is_same_v, ""); assert(std::get(v).size == 3); - v.emplace({1, 2, 3, 4}, 42); + assert(&ref1 == &std::get(v)); + auto& ref2 = v.emplace({1, 2, 3, 4}, 42); + static_assert(std::is_same_v, ""); assert(std::get(v).size == 4); assert(std::get(v).value == 42); - v.emplace({1}); + assert(&ref == &std::get(v)); + auto& ref3 = v.emplace({1}); + static_assert(std::is_same_v, ""); assert(std::get(v).size == 1); + assert(&ref3 == &std::get(v)); } int main() {