std::variant<Types...>::emplace
cppreference.net에서 가져옴
template< class T, class... Args >
T& emplace( Args&&... args );
|
(1) | (C++17부터) (C++20부터 constexpr) |
template< class T, class U, class... Args >
T& emplace( std::initializer_list<U> il, Args&&... args );
|
(2) | (C++17부터) (C++20부터 constexpr) |
template< std::size_t I, class... Args >
std::variant_alternative_t<I, variant>& emplace( Args&&... args );
|
(3) | (C++17부터) (C++20부터 constexpr) |
template< std::size_t I, class U, class... Args >
std::variant_alternative_t<I, variant>&
emplace( std::initializer_list<U> il, Args&&... args );
|
(4) | (C++17부터) (C++20부터 constexpr) |
기존 variant 객체에 새로운 값을 제자리에서 생성합니다.
1)
emplace<I>(std::forward<Args>(args)...)과 동일합니다. 여기서 I는 T의 Types...에 있는 0 기반 인덱스입니다.
- 이 오버로드는
std::is_constructible_v<T, Args...>이true이고T이Types...에 정확히 한 번 나타나는 경우에만 오버로드 해결에 참여합니다.
2)
emplace<I>(il, std::forward<Args>(args)...)과 동일합니다. 여기서 I는 T의 Types...에 있는 0 기반 인덱스입니다.
- 이 오버로드는
std::is_constructible_v<T, std::initializer_list<U>&, Args...>이true이고T이Types...에 정확히 한 번 나타나는 경우에만 오버로드 해결에 참여합니다.
3) 먼저 현재 포함된 값(있는 경우)을 소멸시킵니다. 그런 다음 직접 초기화를 통해
T_I 타입의 값을 std::forward<Args>(args)... 인수로 생성하는 것처럼 포함된 값을 생성합니다. 예외가 발생하면 *this가 valueless_by_exception 상태가 될 수 있습니다.
- 이 오버로드는
std::is_constructible_v<T_I, Args...>이true인 경우에만 오버로드 해결에 참여합니다. I이sizeof...(Types)보다 작지 않으면 컴파일 타임 오류입니다.
4) 먼저 현재 포함된 값(있는 경우)을 소멸시킵니다. 그런 다음 직접 초기화를 통해
T_I 타입의 값을 il, std::forward<Args>(args)... 인수로 생성하는 것처럼 포함된 값을 생성합니다. 예외가 발생하면 *this가 valueless_by_exception 상태가 될 수 있습니다.
- 이 오버로드는
std::is_constructible_v<T_I, std::initializer_list<U>&, Args...>이true인 경우에만 오버로드 해결에 참여합니다. I이sizeof...(Types)보다 작지 않으면 컴파일 타임 오류입니다.
매개변수
| args | - | 새 값을 생성할 때 사용할 생성자 인수 |
| il | - | 새 값을 생성할 때 사용할 initializer_list 인수 |
반환값
새로운 포함된 값에 대한 참조입니다.
예외
1-4)
포함된 값의 초기화 과정에서 발생하는 모든 예외.
참고 사항
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_variant
|
202106L
|
(C++20)
(DR) |
완전한
constexpr
std::variant
(
1-4
)
|
예제
이 코드 실행
#include <iostream> #include <string> #include <variant> int main() { std::variant<std::string> v1; v1.emplace<0>("abc"); // OK std::cout << std::get<0>(v1) << '\n'; v1.emplace<std::string>("def"); // OK std::cout << std::get<0>(v1) << '\n'; std::variant<std::string, std::string> v2; v2.emplace<1>("ghi"); // OK std::cout << std::get<1>(v2) << '\n'; // v2.emplace<std::string>("abc"); -> Error }
출력:
abc def ghi
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| P2231R1 | C++20 |
emplace
가
constexpr
가 아니었으나 필요한 연산들이 C++20에서
constexpr
일 수 있음
|
constexpr 로 만듦 |
참고 항목
variant
에 값을 할당합니다
(public member function) |