close
Пространства имён
Варианты
Действия

std::inout_ptr_t

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Динамическое управление памятью
no section name
Ограниченные алгоритмы неинициализированной памяти
no section name
Поддержка сбора мусора
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)



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