Попытка понять 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);
Другие вопросы по тегам