Попытка понять std :: inout_ptr и std :: out_ptr в C ++ 23
Я читаю список изменений библиотеки, предложенных для C++23, и мне очень любопытно std::out_ptr
а также std::inout_ptr
(их
_t
братья и сестры). Насколько я понимаю, это своего рода оболочка для интеллектуальных указателей, совместимых с необработанными указателями, но мне еще не удалось их понять. Может быть, кто-то знаком с предложением или может дать менее похожее на ISO объяснение или примеры?
1 ответ
TL;DR - это для более простого и неприглядного взаимодействия между параметрами указателя C out / inout и интеллектуальными указателями.
Более длинный ответ
Разделяем вещи.
std::out_ptr
и являются функциями, используемыми для создания объектов типа
std::out_ptr_t
и соответственно. Для чего нужны эти типы и функции? Давайте посмотрим на пример, вдохновленный этим (для простоты я заменил общий аргумент на старый добрый
int
):
int foreign_resetter(int**);
auto up = std::make_unique<int>(5);
if (int ec = foreign_resetter(std::inout_ptr(up)) {
return ec;
}
Как видите, создано с помощью
std::inout_ptr
передается в функцию, принимающую указатель на указатель на аргумент шаблона
std::unique_ptr
. Перед добавлением
std::inout_ptr_t
взаимодействие со старыми параметрами указателя входа-выхода C было гораздо более громоздким и подверженным ошибкам. Это выглядело бы примерно так:
int foreign_resetter(int**);
auto up = std::make_unique<int>(5);
int* up_raw = up.release();
if (int ec = foreign_resetter(&up_raw)) {
return ec;
}
up.reset(up_raw);