我正在阅读为 C++23 提议的库更改列表,我对std::out_ptr
and std::inout_ptr
(他们的_t
兄弟姐妹)很好奇。据我了解,它们是智能指针与原始指针兼容的某种包装器,但我还没有设法理解它们。也许这里有人熟悉该提案,或者可能会给出不太类似 ISO 的解释或示例?
问问题
441 次
1 回答
11
TL;DR - 它是为了 C out/inout 指针参数和智能指针之间的更简单和更无缝的互操作性
更长的答案
让我们把东西分开。std::out_ptr
和std::inout_ptr
是用于分别创建 和 类型对象的std::out_ptr_t
函数std::inout_ptr_t
。这些类型和功能是做什么用的?让我们看一个受此启发的示例(为简单起见,我将泛型参数替换为 good ol' 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_t
,created 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);
于 2021-08-25T07:57:23.787 回答