我正在阅读为C++23提出的库更改列表,我对std::out_ptr和std::inout_ptr (他们的_t兄弟姐妹)很感兴趣。据我所知,它们是智能指针与原始指针兼容的某种包装器,但我还没有理解它们。也许这里有人熟悉这个建议,或者给出一个不太像ISO的解释或例子?
发布于 2021-08-25 07:57:23
TL;DR --这是为了实现inout/inout指针参数和智能指针之间更简单、更无足轻重的互操作性。
更长的答案
我们把这些东西分开。std::out_ptr和std::inout_ptr分别用于创建std::out_ptr_t和std::inout_ptr_t类型的对象。这些类型和功能是用来做什么的?让我们看一个受这启发的示例(为了简单起见,我用好的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创建的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);https://stackoverflow.com/questions/68918312
复制相似问题