Namespaces
Variants

std:: inout_ptr_t

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
Определено в заголовочном файле <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 , зависящие хотя бы от одного программо-определенного типа , не обязаны удовлетворять требованиям первичного шаблона.

Данная лицензия позволяет программе-определенной специализации предоставлять доступ к необработанному указателю, хранящемуся внутри нестандартного умного указателя, внешним функциям.

Функции-члены

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