理解 C++23 中的 std::inout_ptr 和 std::out_ptr
Understanding std::inout_ptr and std::out_ptr in C++23
我正在阅读为 C++23 提议的库更改列表,我对 std::out_ptr
and std::inout_ptr
(它们的 _t
兄弟姐妹)非常好奇。据我所知,它们是某种与原始指针兼容的智能指针包装器,但我还没有设法理解它们。也许这里有人熟悉该提案,或者可能会给出较少 类似 ISO 的解释或示例?
TL;DR - 它是为了在 C out/inout 指针参数和智能指针
之间实现更简单和更无缝的互操作性
更长的答案
让我们把东西分开。 std::out_ptr
和 std::inout_ptr
是分别用于创建 std::out_ptr_t
和 std::inout_ptr_t
类型对象的函数。这些类型和函数有什么用?让我们看一个受 this 启发的示例(为简单起见,我将通用参数替换为 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
创建的 std::inout_ptr_t
被传递给函数,该函数采用指向 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::out_ptr
and std::inout_ptr
(它们的 _t
兄弟姐妹)非常好奇。据我所知,它们是某种与原始指针兼容的智能指针包装器,但我还没有设法理解它们。也许这里有人熟悉该提案,或者可能会给出较少 类似 ISO 的解释或示例?
TL;DR - 它是为了在 C out/inout 指针参数和智能指针
之间实现更简单和更无缝的互操作性更长的答案
让我们把东西分开。 std::out_ptr
和 std::inout_ptr
是分别用于创建 std::out_ptr_t
和 std::inout_ptr_t
类型对象的函数。这些类型和函数有什么用?让我们看一个受 this 启发的示例(为简单起见,我将通用参数替换为 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
创建的 std::inout_ptr_t
被传递给函数,该函数采用指向 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);