Spec-Zone.ru › C++

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)
сбрасывает адаптированный умный указатель после освобождения владения
(открытая функция-член)
operator Pointer*operator void**
(C++23)
преобразует inout_ptr_t в адрес хранилища для вывода
(открытая функция-член)

Функции, не являющиеся членами

inout_ptr
(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

Пример

См. также

out_ptr_t
(C++23)
взаимодействует с внешними функциями-установщиками указателей и сбрасывает умный указатель при уничтожении
(шаблон класса)
unique_ptr
(C++11)
умный указатель с семантикой единоличного владения объектом
(шаблон класса)
shared_ptr
(C++11)
умный указатель с семантикой совместного владения объектом
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/inout_ptr_t

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API