当显式初始化std :: optional时,我应该使用nullopt吗?

ein*_*ica 6 c++ idiomatic optional c++17

一个std::optional<T>可以被初始化到像这样的分离状态:

std::optional<int> oi { nullopt };
Run Code Online (Sandbox Code Playgroud)

但也像这样:

std::optional<int> oi { };
Run Code Online (Sandbox Code Playgroud)

并且类似地用于分配(oi = {}oi = nullopt).

除了个人偏好/美学意义之外,这些之间是否存在差异,这应该让我更喜欢一个?或者根本没关系?

注意:我问的是我想要显式初始化可选项的情况,而不是默认初始化它(例如强调).

Ker*_* SB 9

这完全没关系.选择让同事更好地理解您的代码的任何内容.

  • 那么,可能是`nullopt`,因为大脑在解决这个问题时会花费更少的精力而不是“嗯,如果我使用空括号会发生什么”? (2认同)

pau*_*l-g 5

它们都具有相同的效果-我希望使用最简单的形式(KISS),但它是主观的,选择一个并保持一致。您可能还希望与如何对待代码中的其他对象保持一致,通常是否依赖默认初始化(例如int i{}vs int i{0})?

就我个人而言,当我看到冗余代码时,例如将对象显式初始化为默认值,它确实使我对作者的信心稍有下降-作者真的了解他在做什么,并试图使其更加安全/显式/可读,还是他只是懒得阅读文档?这使我感到奇怪,作者是否理解他写的文章std::vector<std::optional> v(n)或更复杂的例子?如果这是以书面形式记录的决定,那么一切都很好,我可以理解需要提高可读性。

  • 我非常依赖默认初始化,但我经常区分“我不在乎这个值是什么”和“我希望你注意到我默认设置了这个值”。特别是如果我有多个字段 - 有些我可能会默认初始化,而另一些我会明确初始化为某个值(这可能只是默认值)。 (2认同)