Namespaces
Variants

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

cppreference.net에서 가져옴
 
 
유틸리티 라이브러리
일반 유틸리티
관계 연산자 (C++20에서 폐기됨)
정수 비교 함수
(C++20)(C++20)(C++20)    
(C++20)
스왑 및 타입 연산
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
공통 어휘 타입
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
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)