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 не равно нулю.

Пользователи могут контролировать, захватывается ли каждый аргумент для сброса по значению или по ссылке, указав тип объекта или тип ссылки в 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)
сбрасывает адаптированный умный указатель после высвобождения его владения
(публичный член-функция)
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

Пример

См. также

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/w/cpp/memory/inout_ptr_t

Spec-Zone.ru

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