std:: out_ptr
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Non-member functions | ||||
|
out_ptr
|
|
Определено в заголовочном файле
<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
с ассоциированным умным указателем и аргументами сброса
(шаблон функции) |
|
(C++14)
(C++20)
|
создает уникальный указатель, управляющий новым объектом
(шаблон функции) |
|
создает разделяемый указатель, управляющий новым объектом
(шаблон функции) |