什么时候适合使用 std::optional
When is it appropriate to use std::optional
我想知道这是否会被认为是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
的用例也不是好的做法。
相关文章:
- 检查某些类型是否是模板类 std::optional 的实例化
- 使用 std::optional,而不是自己的结构
- C++17:使用 std::optional 来评估枚举是否包含值
- 从返回 std::optional of std::vector 的函数中获取结果到调用方
- API 返回智能指针的 std::optional 以明确指定指针可能为 null 是否有意义?
- 函数可以应用于 std::optional,并返回一个可选值吗?
- 为什么 std::optional::value_or 没有默认 ctor 类型的专用化?
- 使用std::optional时的命名返回值优化
- 为什么返回std::optional有时移动,有时复制
- 为什么 std::optional 的强制转换运算符被忽略了
- C++是否在 std::min 和 std::max 下标准化 std::optional 的行为?
- std::optional - 使用 {} 或 std::nullopt 构造空
- 我可以使用 std::optional 进行错误处理吗?
- 为什么在std::optional的某些实现中有一个虚拟工会成员?
- 有什么东西阻止std::optional::value_or()有条件地不例外吗?
- 子类化 std::optional时编译错误
- 如何在构造函数中使用 std::optional
- 函数模板参数推断使用 std::Optional 失败
- 什么时候适合使用 std::optional
- 为什么 std::optional 运算符* 没有 has_value() 的调试模式断言