【问题标题】:Is std::optional set to std::nullopt when it is declared as a local variable and not explicitly initialized?当 std::optional 被声明为局部变量且未显式初始化时,它是否设置为 std::nullopt?
【发布时间】:2020-11-24 22:18:09
【问题描述】:

int 在本地声明(但未初始化或分配给)时,它的值未定义。当 std::optional<int> 在本地声明而没有显式初始化时,是否同样适用?是一直是std::nullopt,还是未定义值?

【问题讨论】:

标签: c++ stl stdoptional


【解决方案1】:

来自referencestd::optional 构造函数:

constexpr optional() noexcept;

constexpr optional( std::nullopt_t ) noexcept;

构造一个不包含值的对象。

是的,默认初始化的std::optional 没有任何值,但它不是不确定的。

【讨论】:

  • 对象在本地声明但未初始化时是否调用了构造函数?
  • 是的,声明一个optional 对象确实会调用构造函数。
  • 我的解释是,在本地声明的int 不会被默认初始化,但在本地声明的std::optional 将通过调用默认构造函数进行默认初始化。这是正确的吗?
  • 是的,未初始化的int 具有不确定的值。请注意,这仍然是 int 的默认初始化,只是默认初始化使 int 具有不确定的值。
  • @jhourback An int 声明为int i; 默认初始化,只是ints没有构造函数和“默认初始化”在这种情况下意思是“具有不确定的价值”。另一方面,std::optional 确实 有一个默认构造函数,该构造函数将对象初始化为std::nullopt 的值。就像std::string 的默认构造函数将对象初始化为空字符串一样。默认初始化零初始化相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多