Namespaces
Variants

std:: out_ptr

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
Определено в заголовочном файле <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
202311L (C++26) Автономная версия 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(":memory:", std::out_ptr(up));
        sqlite3* db = up.get();
        // выполняем операции с db ...
    }
    {
        // то же самое, но с использованием std::shared_ptr
        std::shared_ptr<sqlite3> sp;
        sqlite3_open(":memory:", std::out_ptr(sp, close_db));
        sqlite3* db = sp.get();
        // выполняем операции с db ...
    }
}

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

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