std::optional 类的实现

新手上路,请多包涵

我需要为可选值实施快速解决方案。我不想拖入任何第三方库。

可选类一般是如何实现的?当一个可选对象处于“空状态”时,它是否仍然默认构造底层对象?

原文由 NFRCR 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 517
1 个回答

可选类一般是如何实现的?

通常,一个布尔标志来指示它是否为空,以及一个适当大小和对齐的字节数组来存储该值。

当一个可选对象处于“空状态”时,它是否仍然默认构造底层对象?

不;这将对存储类型施加不必要的要求,并导致潜在的不良副作用。当 optional 变为非空时,将使用placement-new 创建存储的对象,并在变为空时使用析构函数调用销毁。

对于快速而简单的实现,如果您不需要 Boost 或建议的标准版本的所有灵活性,您可以简单地存储一个默认构造的对象。

我不想拖入任何第三方库。

我会重新考虑为什么你不觉得你想要那个。 Boost 实现仅是标头,经过良好测试,并且应该在标准版本到来时直接替换为标准版本。我当然更相信它,而不是我自己拼凑的东西。

原文由 Mike Seymour 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题