一般默认的可构造std::optional和std::variant

trivially default constructible std::optional and std::variant

本文关键字:std optional variant 默认      更新时间:2023-10-16

是否允许以这样的方式设计std::optional(当前为std::experimental::optional),即对于平凡默认可构造类型T,对应的std::optional< T >也是平凡默认可构类型?

关于CCD_ 5及其积分鉴别器的同样问题。

我自己的答案是:"不,它不能这样设计,因为如果对象有自动存储持续时间,或者它是从非零初始化存储中reinterpret_cast,那么在默认初始化过程中获得的积分鉴别器的值将是不确定的。"我不允许用户每次都进行值初始化。

你的答案是正确的:你不能。规范要求其"初始化标志"在默认构造时设置为false

正如您自己所解释的,您不能以这种方式实现std::optional,因为您将更改其语义(is_trivially_default_constructible是类接口的一部分)。

然而,如果您在代码中出于某种原因需要这种语义,那么就没有理由不能实现一个非常相似的可选类,该类通常是默认可构造的。然后,当使用时,只需零通过{}初始化它,如果这是您想要的,则在bool运算符中将零视为true。