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

std::out_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::out_ptr_t
Функции-элементы
Функции, не являющиеся элементами
 
<tbody> </tbody>
Определено в заголовочном файле <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... соответственно.

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

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

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

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

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

Функции-элементы

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

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

(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*, который им необходим.

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

Пример

Смотрите также

взаимодействует с внешними установщиками указателей, получает начальное значение указателя из умного указателя и сбрасывает его при уничтожении
(шаблон класса) [править]
умный указатель с уникальной семантикой владения объектом
(шаблон класса) [править]
умный указатель с семантикой владения разделяемым объектом
(шаблон класса) [править]