Namespaces
Variants

C++ named requirements: MoveInsertable (since C++11)

From cppreference.net
C++ named requirements

주어진 할당자를 통해 해당 타입의 rvalue로부터 초기화되지 않은 저장소에 해당 타입의 객체를 생성할 수 있음을 지정합니다.

목차

요구사항

주어진 타입, 값 및 표현식:

타입 정의
T 객체 타입
A 할당자 타입
X 다음 모든 조건을 만족하는 컨테이너 타입:
  • X::value_type T 와 동일함.
  • X::allocator_type std:: allocator_traits < A > :: rebind_alloc < T > 와 동일함.
정의
m 타입 A 의 lvalue
p 타입 T* 의 포인터
표현식 정의
rv 타입 T 의 rvalue를 나타내는 표현식
expr std:: allocator_traits < A > :: construct ( m, p, rv )

T 는 다음 조건을 모두 만족할 경우 MoveInsertable 합니다:

  • expr 가 유효한 형태입니다.
  • expr 의 평가 직후, * p 의 값은 평가 전 rv 의 값과 동일합니다.

참고 사항

만약 A std:: allocator < T > 라면, 이는 placement new 를 호출합니다. 즉 :: new ( ( void * ) p ) T ( rv ) (C++20 이전) std:: construct_at ( p, rv ) (C++20 이후) 와 같습니다. 이는 효과적으로 T 가 이동 생성 가능해야 함을 요구합니다.

만약 std:: allocator < T > 또는 유사한 할당자가 사용된다면, 클래스는 이 타입 요구사항을 충족시키기 위해 move constructor 를 구현할 필요가 없습니다: copy constructor const T & 인자를 취하는 경우 rvalue 표현식을 바인딩할 수 있습니다. 만약 MoveInsertable 클래스가 move constructor를 구현한다면, 생성 후 rv 의 값이 명시되지 않는다는 사실을 활용하기 위해 move semantics 도 구현할 수 있습니다.

C++23 이전까지 std::basic_string 의 요소를 생성할 때 사용자 정의 construct 를 사용해야 했지만, 모든 구현체는 기본 메커니즘만 사용했습니다. 이 요구사항은 기존 관행과 일치하도록 P1072R10 에 의해 수정되었습니다.

결함 보고서

다음 동작 변경 결함 보고서는 이전에 게시된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 2177 C++11 expr 평가에 어떠한 사후 조건도 없었음 추가됨

참고 항목

CopyInsertable