std::pmr::polymorphic_allocator<T>:: construct
|
template
<
class
U,
class
...
Args
>
void construct ( U * p, Args && ... args ) ; |
(1) | (C++17부터) |
|
template
<
class
T1,
class
T2,
class
...
Args1
,
class
...
Args2
>
void
construct
(
std::
pair
<
T1, T2
>
*
p,
|
(2) |
(C++17부터)
(C++20 이전까지) |
|
template
<
class
T1,
class
T2
>
void construct ( std:: pair < T1, T2 > * p ) ; |
(3) |
(C++17부터)
(C++20까지) |
|
template
<
class
T1,
class
T2,
class
U,
class
V
>
void construct ( std:: pair < T1, T2 > * p, U && x, V && y ) ; |
(4) |
(C++17부터)
(C++20까지) |
|
template
<
class
T1,
class
T2,
class
U,
class
V
>
void construct ( std:: pair < T1, T2 > * p, const std:: pair < U, V > & xy ) ; |
(5) |
(C++17부터)
(C++20까지) |
|
template
<
class
T1,
class
T2,
class
U,
class
V
>
void construct ( std:: pair < T1, T2 > * p, std:: pair < U, V > && xy ) ; |
(6) |
(C++17부터)
(C++20까지) |
|
template
<
class
T1,
class
T2,
class
NonPair
>
void construct ( std:: pair < T1, T2 > * p, NonPair && non_pair ) ; |
(7) |
(C++17부터)
(C++20까지) |
할당되었지만 초기화되지 않은 저장 공간에 객체를 생성합니다. 이 저장 공간은 p 가 가리키며, 제공된 생성자 인자를 사용합니다. 객체가 자체적으로 할당자를 사용하는 타입이거나 std::pair인 경우, * this 를 생성된 객체에 전달합니다.
U
의 객체를
uses-allocator construction
을 통해
p
가 가리키는 초기화되지 않은 메모리 위치에 생성하며,
*
this
를 할당자로 사용합니다.
이 오버로드는
U
가
std::pair
의 특수화(specialization)가 아닌 경우에만 오버로드 해결에 참여합니다.
(C++20 이전)
|
2)
먼저,
T1
또는
T2
중 하나가 allocator-aware인 경우, 다음 세 가지 규칙에 따라 튜플
x
와
y
를 수정하여
this->resource()
를 포함하도록 하여, 두 개의 새로운 튜플
xprime
과
yprime
을 생성합니다:
2a)
만약
T1
이 allocator-aware가 아니고 (
std::
uses_allocator
<
T1, polymorphic_allocator
>
::
value
==
false
) 그리고
std::
is_constructible
<
T1, Args1...
>
::
value
==
true
이면,
xprime
은
x
으로, 수정되지 않습니다.
2b)
만약
T1
이 할당자 인식형(
std::
uses_allocator
<
T1, polymorphic_allocator
>
::
value
==
true
)이고, 해당 생성자가 할당자 태그를 받는 경우(
std::
is_constructible
<
T1,
std::
allocator_arg_t
, polymorphic_allocator, Args1...
>
::
value
==
true
), 그러면
xprime
은
std::
tuple_cat
(
std::
make_tuple
(
std::
allocator_arg
,
*
this
)
, std
::
move
(
x
)
)
입니다.
2c)
만약
T1
이 allocator-aware이고 (
std::
uses_allocator
<
T1, polymorphic_allocator
>
::
value
==
true
), 그리고 해당 생성자가 마지막 인자로 allocator를 받는 경우 (
std::
is_constructible
<
T1, Args1..., polymorphic_allocator
>
::
value
==
true
), 그러면
xprime
은
std::
tuple_cat
(
std
::
move
(
x
)
,
std::
make_tuple
(
*
this
)
)
입니다.
2d)
그렇지 않으면, 프로그램은 형식이 잘못되었습니다.
동일한 규칙이
T2
와
y
를
yprime
으로의 대체에도 적용됩니다.
xprime
와
yprime
이 생성된 후, 할당된 저장 공간에
p
쌍을 다음과 같이 구성합니다:
::
new
(
(
void
*
)
p
)
pair
<
T1, T2
>
(
std::
piecewise_construct
, std
::
move
(
xprime
)
, std
::
move
(
yprime
)
)
;
.
3)
다음에 해당함
construct
(
p,
std::
piecewise_construct
,
std::
tuple
<>
(
)
,
std::
tuple
<>
(
)
)
, 즉, pair의 멤버 타입이 메모리 리소스를 수용하는 경우 이를 전달합니다.
4)
다음에 해당함
construct(p, std::piecewise_construct, std::forward_as_tuple(std::forward<U>(x)), std::forward_as_tuple(std::forward<V>(y)))
5)
다음에 해당함
construct(p, std::piecewise_construct, std::forward_as_tuple(xy.first), std::forward_as_tuple(xy.second))
6)
다음에 해당함
construct(p, std::piecewise_construct, std::forward_as_tuple(std::forward<U>(xy.first)), std::forward_as_tuple(std::forward<V>(xy.second)))
7)
이 오버로드는 다음의 설명 전용 함수 템플릿이 주어졌을 때에만 오버로드 해결에 참여합니다
template< class A, class B > void /*deduce-as-pair*/( const std::pair<A, B>& ); , /*deduce-as-pair*/ ( non_pair ) 는 평가되지 않은 피연산자로 간주될 때 형식이 올바르지 않습니다. 다음 코드와 동등합니다 construct<T1, T2, T1, T2>(p, std::forward<NonPair>(non_pair)); |
(C++20 이전) |
목차 |
매개변수
| p | - | 할당되었지만 초기화되지 않은 저장 공간에 대한 포인터 |
| args... | - |
T
의 생성자에 전달할 생성자 인자들
|
| x | - |
T1
의 생성자에 전달할 생성자 인자들
|
| y | - |
T2
의 생성자에 전달할 생성자 인자들
|
| xy | - |
두 멤버가 각각
T1
과
T2
의 생성자 인자인 pair
|
| non_pair | - |
추가적인 생성을 위해
pair
로 변환할 non-
pair
인자
|
반환값
(없음)
참고 사항
이 함수는 (
std::allocator_traits
를 통해) 할당자 인식 객체(
std::pmr::vector
또는 할당자로
std::pmr::polymorphic_allocator
를 사용하도록 지정된 다른
std::vector
)에 의해 호출됩니다.
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 2969 | C++17 |
uses-allocator construction passed
resource()
|
passes * this |
| LWG 2975 | C++17 | 일부 경우에 pair 생성에 첫 번째 오버로드가 잘못 사용됨 | pair를 수락하지 않도록 제약됨 |
| LWG 3525 | C++17 |
pair
로 변환 가능한 non-
pair
타입을 처리할 수 있는 오버로드가 없음
|
재구성 오버로드 추가됨 |
참고 항목
|
[static]
|
할당된 저장 공간에 객체를 생성함
(함수 템플릿) |
|
(until C++20)
|
할당된 저장 공간에 객체를 생성함
(
std::allocator<T>
의 public 멤버 함수)
|