std::optional<std::nullopt_t>的合法性与构造后状态问询
关于
std::optional<std::nullopt_t>的构造与状态问题 合法性说明
构造std::optional<std::nullopt_t>是完全合法的。std::optional对模板参数的要求仅为类型完整、可析构,而std::nullopt_t是标准库定义的空类型,完全满足这些条件。
代码std::optional<std::nullopt_t> x(std::nullopt);的行为
这段代码会创建一个不包含值的std::optional<std::nullopt_t>对象。
原因在于std::optional提供了一个专门的构造函数:
constexpr optional(nullopt_t) noexcept;
当传入std::nullopt(它是std::nullopt_t类型的实例)时,会匹配这个构造函数,其作用是将optional初始化为无值状态,而非把std::nullopt作为std::nullopt_t类型的值存储进去。
变量x是否包含值?
不包含。如果想要让std::optional<std::nullopt_t>包含值,需要显式传入std::nullopt_t的实例,比如:
std::optional<std::nullopt_t> x(std::nullopt_t{});
此时x才处于包含值的状态,存储的是一个空的std::nullopt_t对象。
内容的提问来源于stack exchange,提问作者Joshua Green
相关产品推荐
相关产品推荐

