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=
[deleted](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 |
Пример
См. также
|
(C++23) |
взаимодействует с внешними установщиками указателей и сбрасывает умный указатель при уничтожении (шаблон класса) |
|
(C++11) |
умный указатель с уникальными семантиками владения объектом (шаблон класса) |
|
(C++11) |
умный указатель с семантиками совместного владения объектом (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/memory/inout_ptr_t