Namespaces
Variants

std:: inout_ptr_t

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
헤더에 정의됨 <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 의 최소 하나 이상의 프로그램 정의 타입 에 의존하는 경우 기본 템플릿의 요구 사항을 충족할 필요가 없습니다.

이 라이선스는 프로그램 정의 특수화가 비표준 스마트 포인터 내에 저장된 원시 포인터를 외부 함수에 노출하는 것을 허용합니다.

멤버 함수

inout_ptr_t 객체를 생성함
(public 멤버 함수)
operator=
[삭제됨] (C++23)
inout_ptr_t 는 대입할 수 없음
(public 멤버 함수)
소유권 해제 후 적응된 스마트 포인터를 재설정함
(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)
공유 객체 소유권 의미론을 가진 스마트 포인터
(클래스 템플릿)