【发布时间】:2020-11-24 22:18:09
【问题描述】:
当int 在本地声明(但未初始化或分配给)时,它的值未定义。当 std::optional<int> 在本地声明而没有显式初始化时,是否同样适用?是一直是std::nullopt,还是未定义值?
【问题讨论】:
标签: c++ stl stdoptional
当int 在本地声明(但未初始化或分配给)时,它的值未定义。当 std::optional<int> 在本地声明而没有显式初始化时,是否同样适用?是一直是std::nullopt,还是未定义值?
【问题讨论】:
标签: c++ stl stdoptional
来自reference 的std::optional 构造函数:
constexpr optional() noexcept;
constexpr optional( std::nullopt_t ) noexcept;构造一个不包含值的对象。
是的,默认初始化的std::optional 没有任何值,但它不是不确定的。
【讨论】:
optional 对象确实会调用构造函数。
int 不会被默认初始化,但在本地声明的std::optional 将通过调用默认构造函数进行默认初始化。这是正确的吗?
int 具有不确定的值。请注意,这仍然是 int 的默认初始化,只是默认初始化使 int 具有不确定的值。
int 声明为int i; 是默认初始化,只是ints没有构造函数和“默认初始化”在这种情况下意思是“具有不确定的价值”。另一方面,std::optional 确实 有一个默认构造函数,该构造函数将对象初始化为std::nullopt 的值。就像std::string 的默认构造函数将对象初始化为空字符串一样。默认初始化不与零初始化相同。