C++ named requirements: MoveInsertable (since C++11)
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
주어진 할당자를 통해 해당 타입의 rvalue로부터 초기화되지 않은 저장소에 해당 타입의 객체를 생성할 수 있음을 지정합니다.
목차 |
요구사항
주어진 타입, 값 및 표현식:
| 타입 | 정의 |
T
|
객체 타입 |
A
|
할당자 타입 |
X
|
다음 모든 조건을 만족하는 컨테이너 타입:
|
| 값 | 정의 |
| 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 |