Spec-Zone.ru › C++

std::out_ptr_t

Определено в заголовке <memory>
template< class Smart, class Pointer, class... Args >
class out_ptr_t;
(с C++23)

out_ptr_t используется для адаптации типов, таких как умные указатели, для внешних функций, которые выдают свои результаты через Pointer* (обычно T** для некоторого типа объекта T) или параметр void**.

out_ptr_t захватывает дополнительные аргументы при создании, предоставляет хранилище для результата, в который такая внешняя функция записывает, и, наконец, сбрасывает адаптированный объект Smart с результатом и захваченными аргументами при уничтожении.

out_ptr_t ведет себя так, как будто он содержит следующие нестатические данные-члены:

  • ссылку на Smart&, которая привязана к адаптированному объекту при создании,
  • для каждого T в Args..., член типа T, который является аргументом, захваченным при создании и используемым для сброса при уничтожении, и
  • подобъект, подходящий для хранения Pointer внутри него и предоставления объекта void*, где объект Pointer или void* в общем случае предоставляется внешней функции для повторной инициализации.

Пользователи могут управлять тем, как каждый аргумент для сброса захватывается — по значению или по ссылке, указав тип объекта или тип ссылки в Args... соответственно.

Параметры шаблона

Умный - тип объекта (обычно умный указатель), подлежащий адаптации
Указатель - тип объекта (обычно обычный указатель), в который внешняя функция записывает свой результат
Args... - тип захваченных аргументов, используемых для сброса адаптированного объекта
Требования к типу
-Pointer должен соответствовать требованиям NullablePointer.
-Программа некорректна, если Smart является специализацией std::shared_ptr и sizeof...(Args) == 0.

Специализации

В отличие от большинства шаблонов классов в стандартной библиотеке, пользовательские специализации out_ptr_t, которые зависят хотя бы от одного пользовательского типа, не обязаны удовлетворять требованиям основного шаблона.

Это разрешение позволяет пользовательской специализации предоставлять нестандартный умный указатель во внешние функции.

Члены-функции

(конструктор)
(C++23)
создаёт out_ptr_t
(публичная функция-член)
operator=
[удалено](C++23)
out_ptr_t не может быть присвоено
(публичная функция-член)
(деструктор)
(C++23)
сбрасывает адаптированный умный указатель
(публичная функция-член)
operator Pointer*operator void**
(C++23)
преобразует out_ptr_t в адрес хранилища для вывода
(публичная функция-член)

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

out_ptr
(C++23)
создаёт out_ptr_t с ассоциированным умным указателем и аргументами сброса
(шаблон функции)

Примечания

out_ptr_t ожидает, что внешние функции не будут использовать значение указываемого Pointer, а только переинициализируют его. Значение умного указателя до адаптации не используется.

Типичное использование out_ptr_t — создание временных объектов с помощью std::out_ptr, что приводит к немедленному сбросу адаптированного умного указателя. Например, при наличии функции-установщика и умного указателя соответствующего типа, объявленных с помощью int foreign_setter(T**); и std::unique_ptr<T, D> up; соответственно,

int foreign_setter(T**);
std::unique_ptr<T, D> up;
 
if (int ec = foreign_setter(std::out_ptr(up)))
    return ec;

приблизительно эквивалентно

int foreign_setter(T**);
std::unique_ptr<T, D> up;
T* raw_p{};
 
int ec = foreign_setter(&raw_p);
up.reset(raw_p);
if (ec != 0)
    return ec;

Не рекомендуется создавать объект out_ptr_t с продолжительностью жизни, отличной от автоматической, так как такой код, вероятно, приведёт к появлению висячих ссылок и неопределённому поведению при уничтожении.

out_ptr_t запрещает использование, которое приведет к сбросу std::shared_ptr без указания удалителя, так как оно вызовет std::shared_ptr::reset и заменит пользовательский удалитель позже.

Захваченные аргументы обычно упаковываются в std::tuple<Args...>. Реализации могут использовать различные механизмы для хранения необходимых им объектов Pointer или void*.

Макрокоманда проверки наличия функции Значение Std Функция
__cpp_lib_out_ptr 202106L (C++23) std::out_ptr, std::inout_ptr
202311L (C++26) самостоятельные std::out_ptr и std::inout_ptr

Пример

См. также

inout_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/out_ptr_t

Spec-Zone.ru

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