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 ведет себя так, как если бы содержал следующие нестатические члены данных:

  • умная ссылка Smart& , которая связывается с адаптируемым объектом при создании,
  • для каждого T в Args... - член типа T , который представляет аргумент, захваченный при создании и используемый для сброса при уничтожении, и
  • член-подобъект, подходящий для хранения Pointer внутри себя и предоставления объекта типа void * , где Pointer или объект void * обычно предоставляется внешней функции для повторной инициализации.

Пользователи могут управлять тем, захватывается ли каждый аргумент для сброса по копии или по ссылке, указывая тип объекта или ссылочный тип в Args... соответственно.

Содержание

Параметры шаблона

Smart - тип объекта (обычно умный указатель) для адаптации
Pointer - тип объекта (обычно сырой указатель), в который внешняя функция записывает свой результат
Args... - тип захваченных аргументов, используемых для сброса адаптированного объекта
Требования к типам
-
Pointer должен удовлетворять требованиям NullablePointer .
-
Программа является некорректной, если Smart является специализацией std::shared_ptr и sizeof... ( Args ) == 0 .

Специализации

В отличие от большинства шаблонов классов в стандартной библиотеке, программо-определенные специализации шаблона out_ptr_t , зависящие хотя бы от одного программо-определенного типа , не обязаны соответствовать требованиям первичного шаблона.

Данная лицензия позволяет программе-определенной специализации предоставлять доступ к необработанному указателю, хранящемуся внутри нестандартного умного указателя, внешним функциям.

Функции-члены

создает объект out_ptr_t
(публичная функция-член)
operator=
[deleted] (C++23)
out_ptr_t не может быть присвоен
(публичная функция-член)
сбрасывает адаптированный умный указатель
(публичная функция-член)
преобразует out_ptr_t в адрес хранилища для вывода
(публичная функция-член)

Функции, не являющиеся членами класса

(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;
**Примечание:** Весь код C++ внутри тегов `
` и `` оставлен без изменений, как и требовалось. HTML-теги и атрибуты также сохранены в оригинальном виде.

Не рекомендуется создавать объект 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)
умный указатель с семантикой разделяемого владения объектом
(шаблон класса)