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 не равно null.
Пользователи могут управлять тем, захватывается ли каждый аргумент для сброса копированием или по ссылке, указывая в 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) | сбрасывает адаптированный умный указатель после освобождения владения (открытая функция-член) |
|
(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 |
|
__cpp_lib_constexpr_memory | 202506L | (C++26) | Возможность constexpr для std::inout_ptr_t |
Пример
См. также
|
(C++23) | взаимодействует с внешними функциями-установщиками указателей и сбрасывает умный указатель при уничтожении (шаблон класса) |
|
(C++11) | умный указатель с семантикой единоличного владения объектом (шаблон класса) |
|
(C++11) | умный указатель с семантикой совместного владения объектом (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/inout_ptr_t