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

std::out_ptr

Материал из 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 Pointer = void, class Smart, class... Args > auto out_ptr( Smart& s, Args&&... args );
(начиная с C++23)

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

Программа некорректна, если построение возвращаемого значения (смотрите ниже) некорректно.

Параметры

s объект (обычно умный указатель) для адаптации
args... аргументы для сброса при захвате

Возвращаемое значение

std::out_ptr_t<Smart, P, Args&&>(s, std::forward<Args>(args)...), где P

  • Pointer, если Pointer не совпадает с void. Иначе,
  • Smart::pointer, если он действителен и обозначает тип. Иначе,
  • Smart::element_type*, если Smart::element_type является допустимым и обозначает тип. Иначе,
  • std::pointer_traits<Smart>::element_type*.

Примечание

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

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

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

Пример

Используйте std::out_ptr, чтобы адаптировать умный указатель для sqlite3_open, который ожидает sqlite3** в качестве выходного параметра.

#include <memory>
#include <sqlite3.h>

int main()
{
    auto close_db = [](sqlite3* db) { sqlite3_close(db); };

    {
        // открыть базу данных в памяти и управлять её временем жизни
        // с помощью std::unique_ptr
        std::unique_ptr<sqlite3, decltype(close_db)> up;
        sqlite3_open(":память:", std::out_ptr(up));

        sqlite3* db = up.get();
        // сделать что-нибудь с db ...
    }
    {
        // то же, что и выше, но использует std::shared_ptr
        std::shared_ptr<sqlite3> sp;
        sqlite3_open(":память:", std::out_ptr(sp, close_db));

        sqlite3* db = sp.get();
        // сделать что-нибудь с db ...
    }
}

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

(C++23)
создаёт inout_ptr_t с ассоциированным умным указателем и сбрасывает аргументы
(шаблон функции) [править]
создаёт уникальный указатель, который управляет новым объектом
(шаблон функции) [править]
создаёт общий указатель, который управляет новым объектом
(шаблон функции) [править]