inout_ptr_t — std::inout_ptr_t

inout_ptr_t — std::inout_ptr_t

std::inout_ptr_t는 스마트 포인터 같은 타입을, 외부 함수(foreign function)가 Pointer*(보통 T**)나 void** 매개변수로 소유권을 재설정하는 데 쓰는 어댑터예요. C++23에서 도입됐어요.

out_ptr_t와 달리, inout_ptr_t는 적응된 스마트 포인터가 이미 보유한 소유권을 먼저 **해제(release)**하고, 외부 함수가 쓴 결과로 다시 재설정(reset)해요. C API에 "나가면서 만들어줘"가 아니라 "내 것을 넘겨주고 새 것으로 다시 초기화해줘"라는 의도예요.

출처: cppreference

본문

std::inout_ptr_t는 외부 함수가 Pointer*(보통 T**)나 void** 매개변수로 소유권을 재설정하는 스마트 포인터류 타입을 적응하는 데 쓰여요.

template<class Smart, class Pointer, class... Args>
class inout_ptr_t;

inout_ptr_t는 생성 시 추가 인자를 캡처하고, 외부 함수가 접근하는 결과를 위한 저장 공간을 제공하며, 적응된 Smart 객체가 보유한 소유권을 해제하고, 파괴 시 결과와 캡처된 인자로 적응된 Smart 객체를 재설정해요.

내부적으로 다음의 비정적 데이터 멤버를 가진 것처럼 동작해요.

  • 생성 시 적응된 객체에 바인딩되는 Smart& 참조
  • Args...의 각 T에 대한 T 타입 멤버 (생성 시 캡처되고 파괴 시 재설정에 사용)
  • Pointer를 저장하고 void* 객체를 제공하는 멤버 부분 객체

각 재설정 인자를 값으로 캡처할지 참조로 캡처할지는 Args...에 객체 타입을 넣느냐 참조 타입을 넣느냐로 제어해요.

노트 (Notes)

일반적인 사용법은 std::inout_ptr로 임시 객체를 만들어 스마트 포인터를 즉시 재설정하는 것이에요. 외부 함수가 가리키는 Pointer의 값을 사용하지 않고 오직 재설정만 한다고 가정해요.

자동 저장 기간이 아닌 inout_ptr_t 객체를 만드는 것은 매달린 참조를 만들어 파괴 시 정의되지 않은 동작을 일으킬 수 있으므로 권장하지 않아요.

같이 보기

  • std::out_ptr_t
  • std::unique_ptr
  • std::shared_ptr

더 알아보기 (Learn more)

cppreference