C++ 当显式初始化std::optional';s、 我应该使用nullopt吗?

C++ 当显式初始化std::optional';s、 我应该使用nullopt吗?,c++,optional,c++17,idioms,C++,Optional,C++17,Idioms,std::optional可以初始化为脱离状态,如下所示: std::optional<int> oi { nullopt }; std::可选oi{nullopt}; 但也像这样: std::optional<int> oi { }; std::可选oi{}; 同样,对于赋值(oi={}或oi=nullopt) 除了个人偏好/美感之外,这两者之间是否有区别,让我更喜欢其中之一?或者这根本不重要 注意:我问的是我想显式初始化可选项,而不是默认初始化它(例如,为了强

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

std::optional<int> oi { nullopt };
std::可选oi{nullopt};
但也像这样:

std::optional<int> oi { };
std::可选oi{};
同样,对于赋值(
oi={}
oi=nullopt

除了个人偏好/美感之外,这两者之间是否有区别,让我更喜欢其中之一?或者这根本不重要


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

这一点都不重要。选择任何能让同事更好地理解您的代码的方式。

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


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

您如何初始化脱离的
std::函数
s和
std::shared_ptr
s和
std::unique_ptr
s?它也可以这样初始化:
std::optional oi
,如果我可以选择的话,这可能是我会使用的版本。@juanchopanza:allow
std::optional oi=nullopt,如果你不是一个到处都是大括号的人,但仍然想要明确。(哈哈:“显式”,但不是
显式
:-)@juanchopanza:我认为“总是自动”人群与“大括号无处不在”人群基本相同,尽管:-)它似乎确实对性能有影响(取决于实现)。请参阅。我非常依赖默认初始化,但我经常区分“我不在乎值是什么”和“我希望您注意到我在默认情况下设置此值”。特别是如果我有几个字段-一些字段我可能会默认初始化,而另一些字段我会显式初始化为某个值(可能只是默认值)。因此,可能
nullopt
,因为大脑只需要稍微少一点努力就可以明白这一点,而不是“嗯,如果我使用空大括号会发生什么”@einpoklum:是的,但要注意,你在用一种错误的二分法工作。问题下的评论指出了几个进一步的选择,你们都应该相互权衡。(个人而言,我将使用默认初始化或“= nulLopt;”)@ eNoPoCLUM作为一种观点,我发现使用<代码> {} /代码>来表示“MEH,没有什么”(就像空集)是我现代C++代码中的一个非常强的习惯用法。当返回许多可能是空的东西,如容器、可选项或std函数时,它会起作用。
nullopt
的详细信息与此无关。在其他上下文中,需要实际的
nullopt
(例如,
?:
)。