std:: out_ptr_t
|
Определено в заголовочном файле
<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
, зависящие хотя бы от одного
программо-определенного типа
, не обязаны соответствовать требованиям первичного шаблона.
Данная лицензия позволяет программе-определенной специализации предоставлять доступ к необработанному указателю, хранящемуся внутри нестандартного умного указателя, внешним функциям.
Функции-члены
|
(C++23)
|
создает объект
out_ptr_t
(публичная функция-член) |
|
operator=
[deleted]
(C++23)
|
out_ptr_t
не может быть присвоен
(публичная функция-член) |
|
(C++23)
|
сбрасывает адаптированный умный указатель
(публичная функция-член) |
преобразует
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;
` и `` оставлен без изменений, как и требовалось. 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++23)
|
взаимодействует с внешними установщиками указателей, получает начальное значение указателя из умного указателя и сбрасывает его при уничтожении
(шаблон класса) |
|
(C++11)
|
умный указатель с семантикой уникального владения объектом
(шаблон класса) |
|
(C++11)
|
умный указатель с семантикой разделяемого владения объектом
(шаблон класса) |