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

When explicitly initializing std::optional's, should I use nullopt?

一个std::optional<T>可以像这样初始化为脱离状态:

std::optional<int> oi { nullopt };

也喜欢这样:

std::optional<int> oi { };

赋值也是如此(oi = {}oi = nullopt)。

除了个人喜好/审美之外,这两者之间是否存在差异,使我更喜欢其中之一?还是根本不重要?

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

完全没关系。选择能让您的同事更好地理解您的代码的内容。

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

就我个人而言,当我看到冗余代码时,例如将对象显式初始化为其默认值,它确实会稍微降低我对作者的信心 - 作者是否真的理解他在做什么并试图更加安全/ 明确的 / 可读的,或者他只是懒得阅读文档?这让我想知道,作者是否理解他写 std::vector<std::optional> v(n) 或更复杂的例子时会发生什么?如果这是一个记录在案的决定,采用编码风格,那么一切都很好,我可以理解需要提高可读性。