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....

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

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

Макрос проверки поддержки Значение Стандарт Возможность
__cpp_lib_out_ptr 202106L (C++23) std::out_ptr, std::inout_ptr
202311L (C++26) автономные std::out_ptr и std::inout_ptr
__cpp_lib_constexpr_memory 202506L (C++26) constexpr-std::out_ptr_t

Пример

См. также

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/cpp/memory/out_ptr_t

Spec-Zone.ru

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