平凡的默认可构造std :: optional和std :: variant

时间:2015-12-03 08:29:37

标签: c++ c++11 c++14 optional variant

是否允许以这种方式设计std::optional(当前std::experimental::optional),对于简单的默认可构造类型T,相应的std::optional< T >也可以简单地默认构造?< / p>

同样的问题,即std::variant及其整体鉴别器。

我自己的答案是:“不,它不能以这种方式设计,因为如果对象具有自动存储持续时间或者如果它是reinterpret_cast,那么在默认初始化期间获得的积分鉴别器的值将是不确定的。来自非零初始化存储。“我不希望每次都要求用户进行值初始化。

2 个答案:

答案 0 :(得分:8)

你的答案是对的:你做不到。规范要求在默认构造时将其“初始化标志”设置为IAutoComplete

答案 1 :(得分:3)

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

但是,如果您在代码中出于某种原因需要此语义,则没有理由,为什么您无法实现一个非常类似的默认可构造的可选类。然后,当使用时,只需通过{}初始化它,并且 - 如果这是你想要的 - 在bool运算符中将零视为真。