From cppreference.com
template<classT,class...Args>T&emplace(Args&&...args); (1)(since C++17)
(constexpr since C++20)template<classT,classU,class...Args>T&emplace(std::initializer_list<U>il,Args&&...args); (2)(since C++17)
(constexpr since C++20)template<std::size_tI,class...Args>std::variant_alternative_t<I,variant>&emplace(Args&&...args); (3)(since C++17)
(constexpr since C++20)template<std::size_tI,classU,class...Args>std::variant_alternative_t<I,variant>&emplace(std::initializer_list<U>il,Args&&...args); (4)(since C++17)
(constexpr since C++20)Creates a new value in-place, in an existing variant object
1) Equivalent to emplace<I>(std::forward<Args>(args)...), where I is the zero-based index of T in Types....
This overload participates in overload resolution only if std::is_constructible_v<T,Args...> is true, and T occurs exactly once in Types....
2) Equivalent to emplace<I>(il,std::forward<Args>(args)...), where I is the zero-based index of T in Types....
This overload participates in overload resolution only if std::is_constructible_v<T,std::initializer_list<U>&,Args...> is true, and T occurs exactly once in Types....
3) First, destroys the currently contained value (if any). Then
the contained value as if constructing a value of type T_I with the arguments std::forward<Args>(args).... If an exception is thrown, *this may become
.
This overload participates in overload resolution only if std::is_constructible_v<T_I,Args...> is true.
It is a compile-time error if I is not less than sizeof...(Types).
4) First, destroys the currently contained value (if any). Then
the contained value as if constructing a value of type T_I with the arguments il,std::forward<Args>(args).... If an exception is thrown, *this may become
.
This overload participates in overload resolution only if std::is_constructible_v<T_I,std::initializer_list<U>&,Args...> is true.
It is a compile-time error if I is not less than sizeof...(Types).
Parameters
args - constructor arguments to use when constructing the new value il - initializer_list argument to use when constructing the new value Return value
A reference to the new contained value.
Exceptions
1-4) Any exception thrown during the initialization of the contained value.
Notes
macro ValueStdFeature
(C++20)
(DR)Fully constexprstd::variant(
)Example
Run this code
#include<iostream>#include<string>#include<variant>intmain(){std::variant<std::string>v1;v1.emplace<0>("abc");// OKstd::cout<<std::get<0>(v1)<<'\n';v1.emplace<std::string>("def");// OKstd::cout<<std::get<0>(v1)<<'\n';std::variant<std::string,std::string>v2;v2.emplace<1>("ghi");// OKstd::cout<<std::get<1>(v2)<<'\n';// v2.emplace<std::string>("abc"); -> Error}Output:
abc def ghi Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR Applied to Behavior as published Correct behavior
C++20 emplace was not constexpr while the required operations can be constexpr in C++20 made constexprSee also