std:: inout_ptr_t
|
헤더에 정의됨
<memory>
|
||
|
template
<
class
Smart,
class
Pointer,
class
...
Args
>
class inout_ptr_t ; |
(C++23부터) | |
inout_ptr_t
는 외부 함수에서
Pointer*
(일반적으로 어떤 객체 타입
T
에 대한
T**
) 또는
void
**
매개변수를 통해 소유권을 재설정하는 경우, 스마트 포인터와 같은 타입을 적응시키는 데 사용됩니다.
inout_ptr_t
는 생성 시 추가 인수를 캡처하고, 앞서 언급된 외부 함수가 접근하는 결과를 위한 저장 공간을 제공하며, 적응된
Smart
객체가 보유한 소유권을 해제하고, 최종적으로 소멸될 때 캡처된 인수와 결과로 적응된
Smart
객체를 재설정합니다.
inout_ptr_t
는 다음과 같은 비정적 데이터 멤버를 보유하는 것처럼 동작합니다:
-
a
Smart&참조로, 생성 시 적응된 객체에 바인딩됩니다, -
Args...내의 모든T에 대해,T타입의 멤버로, 생성 시 캡처된 인자이며 소멸 시 재설정(resetting)에 사용됩니다, 그리고 -
Pointer를 저장하고 void * 객체를 제공하는 데 적합한 멤버 하위 객체로,Pointer또는 void * 객체는 일반적으로 소유권 재설정을 위해 외부 함수에 노출됩니다.
만약
Smart
가 포인터 타입이 아닌 경우,
release
(
)
는 적응된 객체에서 최대 한 번 호출됩니다. 구현체는 생성자 내에서, 또는
Pointer
값이 null이 아닌 경우 소멸자 내에서 재설정하기 전에
release
(
)
를 호출할 수 있습니다.
사용자는 각 리셋 인수가 복사에 의해 캡처되는지 참조에 의해 캡처되는지를 제어할 수 있으며, 이를 위해 각각
Args...
에서 객체 타입이나 참조 타입을 지정할 수 있습니다.
목차 |
템플릿 매개변수
| Smart | - | 적응할 객체의 타입 (일반적으로 스마트 포인터) |
| Pointer | - | 외부 함수가 소유권 재설정을 위해 접근하는 객체의 타입 (일반적으로 원시 포인터) |
| Args... | - | 적응된 객체를 재설정하는 데 사용되는 캡처된 인자들의 타입 |
| 타입 요구사항 | ||
-
Pointer
는
NullablePointer
요구사항을 충족해야 함
|
||
-
Smart
가
std::shared_ptr
특수화인 경우 프로그램의 형식이 잘못됨
|
||
특수화
표준 라이브러리의 대부분의 클래스 템플릿과 달리,
프로그램 정의 특수화
는
inout_ptr_t
의 최소 하나 이상의
프로그램 정의 타입
에 의존하는 경우 기본 템플릿의 요구 사항을 충족할 필요가 없습니다.
이 라이선스는 프로그램 정의 특수화가 비표준 스마트 포인터 내에 저장된 원시 포인터를 외부 함수에 노출하는 것을 허용합니다.
멤버 함수
|
(C++23)
|
inout_ptr_t
객체를 생성함
(public 멤버 함수) |
|
operator=
[삭제됨]
(C++23)
|
inout_ptr_t
는 대입할 수 없음
(public 멤버 함수) |
|
(C++23)
|
소유권 해제 후 적응된 스마트 포인터를 재설정함
(public 멤버 함수) |
inout_ptr_t
를 출력용 저장소의 주소로 변환함
(public 멤버 함수) |
비멤버 함수
|
(C++23)
|
연관된 스마트 포인터와 리셋 인자를 가진
inout_ptr_t
를 생성합니다
(함수 템플릿) |
참고 사항
inout_ptr_t
는 외부 함수가 가리키는
Pointer
값으로 표현된 소유권을 해제한 후 이를 재초기화할 것이라고 기대합니다. 이러한 연산은 단독 소유권을 필요로 하므로,
std::shared_ptr
와의 사용은 금지됩니다.
inout_ptr_t
의 일반적인 사용법은 적절한 타입의 스마트 포인터를 즉시 재설정하는
std::inout_ptr
을 통해 임시 객체를 생성하는 것입니다. 예를 들어, 설정자 함수와 다음과 같이 선언된 적절한 타입의 스마트 포인터가 주어졌을 때:
int
foreign_resetter
(
T
**
)
;
및
std::
unique_ptr
<
T, D
>
up
;
각각,
if (int ec = foreign_resetter(std::inout_ptr(up))) return ec;
는 대략적으로 다음과 동등합니다
T *raw_p = up.get(); up.release(); int ec = foreign_resetter(&raw_p); up.reset(raw_p); if (ec != 0) return ec;
inout_ptr_t
객체를
자동 저장 기간
이외의 저장 기간으로 생성하는 것은 권장되지 않습니다. 이러한 코드는 참조가 매달릴 가능성이 높으며, 소멸 시 미정의 동작을 초래할 수 있기 때문입니다.
캡처된 인수들은 일반적으로
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)
|
공유 객체 소유권 의미론을 가진 스마트 포인터
(클래스 템플릿) |