Namespaces
Variants

std::variant<Types...>:: emplace

From cppreference.net
Utilities library
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 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-기반 인덱스입니다.
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 상태가 될 수 있습니다.

목차

매개변수

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)