std::variant<Types...>:: emplace
From 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
>
&
|
(4) |
(C++17부터)
(C++20부터 constexpr) |
기존
variant
객체 내부에 새로운 값을 제자리에서 생성합니다
1)
emplace<I>(std::forward<Args>(args)...)
와 동등하며, 여기서
I
는
Types...
내에서
T
의 0-기반 인덱스입니다.
-
이 오버로드는
std::is_constructible_v<T, Args...>가true이고T가Types...에 정확히 한 번 나타날 때만 오버로드 해결에 참여합니다.
2)
il
과
args...
를 사용하여
emplace<I>(il, std::forward<Args>(args)...)
와 동일합니다. 여기서
I
는
Types...
내에서
T
의 0-기반 인덱스입니다.
-
이 오버로드는
std::
is_constructible_v
<
T,
std::
initializer_list
<
U
>
&
, Args...
>
가
true
이고,
T가Types...에 정확히 한 번 나타나는 경우에만 오버로드 해결에 참여합니다.
3)
먼저, 현재 포함된 값(있는 경우)을 파괴합니다. 그런 다음
직접 초기화(direct-initializes)
방식으로
T_I
타입의 값을 인자들
std::
forward
<
Args
>
(
args
)
...
로 구성하듯 포함된 값을 초기화합니다. 예외가 발생하면,
*
this
는
valueless_by_exception
상태가 될 수 있습니다.
- 이 오버로드는 std:: is_constructible_v < T_I, Args... > 가 true 인 경우에만 오버로드 해결에 참여합니다.
-
I가 sizeof... ( Types ) 보다 작지 않으면 컴파일 타임 오류입니다.
4)
먼저, 현재 포함된 값(있는 경우)을 파괴합니다. 그런 다음
직접 초기화(direct-initializes)
방식으로 포함된 값을
T_I
타입의 값을 다음과 같은 인자들로 구성하는 것처럼 초기화합니다:
il,
std::
forward
<
Args
>
(
args
)
...
. 예외가 발생하면,
*
this
는
valueless_by_exception
상태가 될 수 있습니다.
- 이 오버로드는 다음 조건이 std:: is_constructible_v < T_I, std:: initializer_list < U > & , Args... > 일 때만 오버로드 해결에 참여합니다.
-
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) |