out_ptr_t — std::out_ptr_t

out_ptr_t — std::out_ptr_t

std::out_ptr_t는 스마트 포인터 같은 타입을, 외부 함수가 Pointer*(보통 T**)나 void** 매개변수로 결과를 출력하는 데 쓰는 어댑터예요. C++23에서 도입됐어요.

C API 중 "포인터를 인자로 넘겨주면 그 포인터 포인터에 새 값을 채워준다"는 형태가 있어요. 예를 들어 void make_thing(T** out) 같은 함수요. out_ptr_t는 스마트 포인터와 이런 C API를 안전하게 이어주는 징검다리 역할을 해요.

출처: cppreference

본문

std::out_ptr_t는 외부 함수가 Pointer*(보통 T**)나 void** 매개변수로 결과를 출력하는 스마트 포인터류 타입을 적응하는 데 쓰여요.

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

out_ptr_t는 생성 시 추가 인자를 캡처하고, 위와 같은 외부 함수가 쓰는 결과를 위한 저장 공간을 제공하며, 파괴 시 결과와 캡처된 인자로 적응된 Smart 객체를 재설정(reset)해요.

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

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

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

노트 (Notes)

out_ptr_t는 외부 함수가 가리키는 Pointer의 이전 값을 사용하지 않고 오직 재초기화만 한다고 가정해요. 적응된 스마트 포인터가 이전에 가진 값은 사용되지 않아요.

일반적인 사용법은 std::out_ptr로 임시 객체를 만들어 스마트 포인터를 즉시 재설정하는 것이에요. 예를 들어 int foreign_setter(T**);라는 함수와 std::unique_ptr<T, D> up;가 있을 때:

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를 재설정하는 사용을 금지해요. 이는 shared_ptr::reset을 호출해 커스텀 삭제자를 나중에 대체하는 일을 막기 위해서예요.

같이 보기

  • std::inout_ptr_t
  • std::unique_ptr
  • std::shared_ptr

더 알아보기 (Learn more)

cppreference