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