std:: out_ptr_t
|
헤더 파일에 정의됨
<memory>
|
||
|
template
<
class
Smart,
class
Pointer,
class
...
Args
>
class out_ptr_t ; |
(C++23부터) | |
out_ptr_t
는 외부 함수가 결과를
Pointer*
(일반적으로 어떤 객체 타입
T
에 대한
T**
) 또는
void
**
매개변수를 통해 출력하도록 스마트 포인터와 같은 타입을 적응시키는 데 사용됩니다.
out_ptr_t
는 생성 시 추가 인수를 캡처하고, 앞서 언급된 외부 함수가 결과를 기록할 저장 공간을 제공하며, 최종적으로 소멸될 때 캡처된 인수들과 함께 결과를 적응된
Smart
객체로 재설정합니다.
out_ptr_t
는 다음과 같은 비정적 데이터 멤버를 보유하는 것처럼 동작합니다:
-
a
Smart&참조로, 생성 시 적응된 객체에 바인딩됩니다, -
for every
TinArgs..., a member of typeT로, 생성 시 캡처된 인자이며 소멸 시 재설정(resetting)에 사용됩니다, 그리고 -
a member subobject that suitable for storing a
Pointerwithin it and providing a void * object, where thePointeror void * object is generally exposed to a foreign function for re-initialization.
사용자는 각 리셋 인수가 복사에 의해 캡처되는지 참조에 의해 캡처되는지를 제어할 수 있으며, 이를 위해 각각
Args...
에서 객체 타입이나 참조 타입을 지정할 수 있습니다.
목차 |
템플릿 매개변수
| Smart | - | 적응할 객체의 타입(일반적으로 스마트 포인터) |
| Pointer | - | 외부 함수가 결과를 기록할 객체의 타입(일반적으로 원시 포인터) |
| Args... | - | 적응된 객체를 재설정하는 데 사용되는 캡처된 인자들의 타입 |
| 타입 요구사항 | ||
-
Pointer
는
NullablePointer
요구사항을 충족해야 함
|
||
-
Smart
가
std::shared_ptr
특수화이고
sizeof...
(
Args
)
==
0
인 경우 프로그램의 형식이 올바르지 않음
|
||
특수화
표준 라이브러리의 대부분의 클래스 템플릿과 달리,
프로그램 정의 특수화
는
out_ptr_t
의 최소 하나 이상의
프로그램 정의 타입
에 의존하는 경우 기본 템플릿의 요구 사항을 충족할 필요가 없습니다.
이 라이선스는 프로그램 정의 특수화가 비표준 스마트 포인터 내에 저장된 원시 포인터를 외부 함수에 노출하는 것을 허용합니다.
멤버 함수
|
(C++23)
|
out_ptr_t
를 생성합니다
(public 멤버 함수) |
|
operator=
[삭제됨]
(C++23)
|
out_ptr_t
는 대입할 수 없음
(public 멤버 함수) |
|
(C++23)
|
적응된 스마트 포인터를 재설정합니다
(public 멤버 함수) |
out_ptr_t
를 출력을 위한 저장소의 주소로 변환합니다
(public 멤버 함수) |
비멤버 함수
|
(C++23)
|
연관된 스마트 포인터와 리셋 인자를 가진
out_ptr_t
생성
(함수 템플릿) |
참고 사항
out_ptr_t
는 외부 함수들이 가리키는
Pointer
의 값을 사용하지 않고 오직 재초기화만 한다고 가정합니다. 어댑션 전 스마트 포인터의 값은 사용되지 않습니다.
out_ptr_t
의 일반적인 사용법은 적절한 타입의 스마트 포인터를 즉시 재설정하는
std::out_ptr
을 통해 임시 객체를 생성하는 것입니다. 예를 들어, 설정자 함수와 해당 타입의 스마트 포인터가 각각
int
foreign_setter
(
T
**
)
;
와
std::
unique_ptr
<
T, D
>
up
;
로 선언된 경우,
int foreign_setter(T**); std::unique_ptr<T, D> up; if (int ec = foreign_setter(std::out_ptr(up))) return ec;
는 대략적으로 다음과 동등합니다
int foreign_setter(T**); std::unique_ptr<T, D> up; T* raw_p{}; int ec = foreign_setter(&raw_p); up.reset(raw_p); if (ec != 0) return ec;
out_ptr_t
객체를 자동 저장 기간 이외의
저장 기간
으로 생성하는 것은 권장되지 않습니다. 이러한 코드는 참조가 매달리는 상황을 초래할 가능성이 높으며, 소멸 시 미정의 동작을 일으킬 수 있기 때문입니다.
out_ptr_t
는 삭제자를 지정하지 않고
std::shared_ptr
을 재설정하는 사용을 금지합니다. 왜냐하면 이는
std::shared_ptr::reset
을 호출하여 나중에 사용자 정의 삭제자를 대체하기 때문입니다.
캡처된 인수들은 일반적으로
std::
tuple
<
Args...
>
로 패킹됩니다. 구현체들은
Pointer
또는
void
*
객체를 보유하는 데 필요한 메커니즘을 제공하기 위해 서로 다른 방식을 사용할 수 있습니다.
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_out_ptr
|
202106L
|
(C++23) |
std::out_ptr
,
std::inout_ptr
|
202311L
|
(C++26) |
독립 실행 환경
std::out_ptr
및
std::inout_ptr
|
예제
|
이 섹션은 불완전합니다
이유: 예제가 없음 |
참고 항목
|
(C++23)
|
외부 포인터 설정자와 상호 운용되며, 스마트 포인터로부터 초기 포인터 값을 획득하고 소멸 시 재설정함
(클래스 템플릿) |
|
(C++11)
|
고유한 객체 소유권 의미론을 가진 스마트 포인터
(클래스 템플릿) |
|
(C++11)
|
공유 객체 소유권 의미론을 가진 스마트 포인터
(클래스 템플릿) |