是否允许以这种方式设计std::optional
(当前std::experimental::optional
),对于简单的默认可构造类型T
,相应的std::optional< T >
也可以简单地默认构造?< / p>
同样的问题,即std::variant
及其整体鉴别器。
我自己的答案是:“不,它不能以这种方式设计,因为如果对象具有自动存储持续时间或者如果它是reinterpret_cast
,那么在默认初始化期间获得的积分鉴别器的值将是不确定的。来自非零初始化存储。“我不希望每次都要求用户进行值初始化。
答案 0 :(得分:8)
你的答案是对的:你做不到。规范要求在默认构造时将其“初始化标志”设置为IAutoComplete
。
答案 1 :(得分:3)
正如您自己解释的那样,您无法以这种方式实现std :: optional,因为您将更改其语义(is_trivially_default_constructible是类接口的一部分)。
但是,如果您在代码中出于某种原因需要此语义,则没有理由,为什么您无法实现一个非常类似的默认可构造的可选类。然后,当使用时,只需通过{}初始化它,并且 - 如果这是你想要的 - 在bool运算符中将零视为真。