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 (public функция-элемент) |
operator= [удалено](C++23) |
inout_ptr_t не может быть присвоен (public функция-элемент) |
(C++23) |
сбрасывает адаптированный умный указатель после освобождения его владения (public функция-элемент) |
преобразует inout_ptr_t в адрес хранилища для вывода (public функция-элемент) |
Функции, не являющиеся элементами
(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
|
Пример
| Этот раздел не завершён Причина: нет примера |
Смотрите также
(C++23) |
взаимодействует с установщиками внешних указателей и сбрасывает умный указатель при уничтожении (шаблон класса) |
(C++11) |
умный указатель с уникальной семантикой владения объектом (шаблон класса) |
(C++11) |
умный указатель с семантикой владения разделяемым объектом (шаблон класса) |