什么时候适合使用 std::optional

When is it appropriate to use std::optional

本文关键字:std optional 什么时候      更新时间:2023-10-16

我想知道这是否会被认为是std::optional的有效用法。我有一个返回process_id(std::uint32_t值)的函数,如果我们找不到目标进程 ID 或返回 std::optional 更合适,拥有一个标准的"std::uint32_t"函数返回 0 会更有效吗?

例:

std::optional<std::uint32_t> FindProcessID(std::string_view process)
{
bool find = false;
if (!find)
// we fail to find the process_id and return nothing.
return std::nullopt;
else if (find)
return 100; // return the id
}

我在返回unique_ptr时也这样做,而不是只返回一个 nullptr,但我不确定这是否会被视为对所述功能的"滥用",以及是否最好只返回 0 并检查该值。提前谢谢你。

我想知道这是否会被认为是std::optional的有效用法

是的,是的,是的 - 这就是std::optional的目的!

如果我们失败了,返回 0 会更有效吗

从技术上讲是的,std::optional是一个包装器,所以它带有很小的开销。但是,这是代码中的性能瓶颈的可能性极低。如果不确定,请创建一个基准并比较函数的两个版本。

我目前在返回unique_ptr时也这样做,但我不确定这是否会被视为"滥用"所述功能

这确实不是std::unique_ptr的预期,惯用用例。代码的读者希望std::unique_ptr处理某些(可能是多态)对象的独占所有权。将基元积分类型放入智能指针的有效方案也不多,将std::unique_ptr用于非常适合std::optional的用例也不是好的做法。