Namespaces
Variants

std:: out_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 out_ptr_t ;
(C++23부터)

out_ptr_t 는 외부 함수가 결과를 Pointer* (일반적으로 어떤 객체 타입 T 에 대한 T** ) 또는 void ** 매개변수를 통해 출력하도록 스마트 포인터와 같은 타입을 적응시키는 데 사용됩니다.

out_ptr_t 는 생성 시 추가 인수를 캡처하고, 앞서 언급된 외부 함수가 결과를 기록할 저장 공간을 제공하며, 최종적으로 소멸될 때 캡처된 인수들과 함께 결과를 적응된 Smart 객체로 재설정합니다.

out_ptr_t 는 다음과 같은 비정적 데이터 멤버를 보유하는 것처럼 동작합니다:

  • a Smart& 참조로, 생성 시 적응된 객체에 바인딩됩니다,
  • for every T in Args... , a member of type T 로, 생성 시 캡처된 인자이며 소멸 시 재설정(resetting)에 사용됩니다, 그리고
  • a member subobject that suitable for storing a Pointer within it and providing a void * object, where the Pointer or 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 의 최소 하나 이상의 프로그램 정의 타입 에 의존하는 경우 기본 템플릿의 요구 사항을 충족할 필요가 없습니다.

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

멤버 함수

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