考虑以下结构,std::optional其中包含一个绝对具有“正常”默认构造函数的类型。
#include <optional>
#include <string>
struct Foo
{
Foo() = default;
const std::optional<std::string> m_value;
};
bool function()
{
Foo foo;
return bool(foo.m_value);
}
Run Code Online (Sandbox Code Playgroud)
使用 clang 9 编译以下内容(使用系统的默认值libstdc++,对于它的 gcc 8)会给出一个意外警告:
<source>:6:5: warning: explicitly defaulted default constructor is implicitly deleted [-Wdefaulted-function-deleted]
Foo() = default;
^
<source>:7:38: note: default constructor of 'Foo' is implicitly deleted because field 'm_value' of const-qualified type 'const std::optional<std::string>' (aka 'const optional<basic_string<char> >') would not be initialized
const std::optional<std::string> m_value;
^
Run Code Online (Sandbox Code Playgroud)
Foo foo;由于它使用了所述已删除的构造函数,因此也存在硬错误。
一个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).
除了个人偏好/美学意义之外,这些之间是否存在差异,这应该让我更喜欢一个?或者根本没关系?
注意:我问的是我想要显式初始化可选项的情况,而不是默认初始化它(例如强调).
当 anint被本地声明(但未初始化或赋值)时,它的值是未定义的。当std::optional<int>在本地声明而没有显式初始化时,是否同样适用?它总是std::nullopt,还是具有未定义的值?