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

时间:2016-10-14 09:10:47

标签: c++ optional c++17 idiomatic

std::optional<T>可以初始化为脱离状态,如下所示:

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

但也是如此:

std::optional<int> oi { };

,同样适用于作业(oi = {}oi = nullopt)。

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

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

2 个答案:

答案 0 :(得分:9)

根本没关系。选择让同事更好地理解您的代码的任何内容。

答案 1 :(得分:4)

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

就个人而言,当我看到冗余代码时,比如明确地将对象初始化为默认值,它确实会减少我对作者的信心 - 作者是否真的明白他在做什么并试图更加安全/明确/可读,或者他只是懒得阅读文档?这让我很奇怪,作者是否理解在撰写std::vector<std::optional> v(n)或更复杂的例子时会发生什么?如果这是一个记录在案的决定,那么一切都很好,我就能理解提高可读性的必要性。