std:: inout_ptr_t
|
Определено в заголовочном файле
<memory>
|
||
|
template
<
class
Smart,
class
Pointer,
class
...
Args
>
class inout_ptr_t ; |
(начиная с C++23) | |
inout_ptr_t
используется для адаптации типов, таких как умные указатели, для внешних функций, которые сбрасывают владение через параметр
Pointer*
(обычно
T**
для некоторого типа объекта
T
) или
void
**
параметр.
inout_ptr_t
захватывает дополнительные аргументы при конструировании, предоставляет хранилище для результата, к которому обращается упомянутая внешняя функция, освобождает владение, удерживаемое адаптированным объектом
Smart
, и, наконец, переустанавливает адаптированный объект
Smart
с результатом и захваченными аргументами при своем разрушении.
inout_ptr_t
ведет себя так, как если бы он содержал следующие нестатические члены данных:
-
умная ссылка
Smart&, которая связывается с адаптированным объектом при создании, -
для каждого
TвArgs...- член типаT, который представляет собой аргумент, захваченный при создании и используемый для сброса при уничтожении, и -
член-подобъект, подходящий для хранения
Pointerвнутри себя и предоставления объекта типа void * , гдеPointerили void * объект обычно предоставляется внешней функции для сброса владения.
Если
Smart
не является типом указателя,
release
(
)
вызывается не более одного раза для адаптированного объекта. Реализации могут вызывать
release
(
)
в конструкторе, или перед сбросом в деструкторе, если значение
Pointer
не является нулевым.
Пользователи могут управлять тем, захватывается ли каждый аргумент для сброса по копии или по ссылке, указывая тип объекта или ссылочный тип в
Args...
соответственно.
Содержание |
Параметры шаблона
| Smart | - | тип объекта (обычно умный указатель) для адаптации |
| Pointer | - | тип объекта (обычно сырой указатель), к которому внешняя функция обращается для сброса владения |
| Args... | - | тип захваченных аргументов, используемых для сброса адаптированного объекта |
| Требования к типам | ||
-
Pointer
должен удовлетворять требованиям
NullablePointer
.
|
||
-
Smart
является специализацией
std::shared_ptr
.
|
||
Специализации
В отличие от большинства шаблонов классов в стандартной библиотеке,
программо-определенные специализации
шаблона
inout_ptr_t
, зависящие хотя бы от одного
программо-определенного типа
, не обязаны удовлетворять требованиям первичного шаблона.
Данная лицензия позволяет программе-определенной специализации предоставлять доступ к необработанному указателю, хранящемуся внутри нестандартного умного указателя, внешним функциям.
Функции-члены
|
(C++23)
|
создаёт объект
inout_ptr_t
(общедоступная функция-член) |
|
operator=
[удалена]
(C++23)
|
inout_ptr_t
не может быть присвоен
(общедоступная функция-член) |
|
(C++23)
|
сбрасывает адаптированный умный указатель после освобождения владения
(общедоступная функция-член) |
преобразует
inout_ptr_t
в адрес хранилища для вывода
(общедоступная функция-член) |
Функции, не являющиеся членами класса
|
(C++23)
|
создает
inout_ptr_t
с ассоциированным умным указателем и аргументами сброса
(шаблон функции) |
Примечания
inout_ptr_t
ожидает, что внешние функции освобождают владение, представленное значением указателя
Pointer
, и затем переинициализируют его. Поскольку такая операция требует уникального владения, использование с
std::shared_ptr
запрещено.
Типичное использование
inout_ptr_t
заключается в создании временных объектов через
std::inout_ptr
, который немедленно сбрасывает адаптированный умный указатель. Например, при наличии функции-сеттера и умного указателя соответствующего типа, объявленных как
int
foreign_resetter
(
T
**
)
;
и
std::
unique_ptr
<
T, D
>
up
;
соответственно,
if (int ec = foreign_resetter(std::inout_ptr(up))) return ec;
примерно эквивалентно
T *raw_p = up.get(); up.release(); int ec = foreign_resetter(&raw_p); up.reset(raw_p); if (ec != 0) return ec;
Не рекомендуется создавать объект
inout_ptr_t
с
продолжительностью хранения
отличной от автоматической, поскольку такой код может привести к появлению висячих ссылок и неопределённому поведению при уничтожении.
Захваченные аргументы обычно упаковываются в
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)
|
умный указатель с семантикой разделяемого владения объектом
(шаблон класса) |