理解 C++23 中的 std::inout_ptr 和 std::out_ptr

我一直在阅读为 C++23 提出的库更改列表,我对std::out_ptrand std::inout_ptr(他们的_t兄弟姐妹)很好奇。据我所知,它们是智能指针与原始指针兼容的某种包装,但我还没有设法理解它们。也许这里有人熟悉该提案,或者可能会给出不太像ISO 的解释或示例?

回答

TL;DR - 它用于 C out/inout 指针参数和智能指针之间更简单和更无缝的互操作性

更长的答案

让我们把东西分开。std::out_ptrstd::inout_ptr是用于分别创建类型std::out_ptr_t和对象的函数std::inout_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_tcreated withstd::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);

以上是理解 C++23 中的 std::inout_ptr 和 std::out_ptr的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>