【发布时间】:2023-03-15 07:56:01
【问题描述】:
是否允许以这样的方式设计std::optional(当前为std::experimental::optional),即对于普通默认可构造类型T,对应的std::optional< T >也是普通默认可构造类型?
关于std::variant 及其积分鉴别器的相同问题。
我自己的回答是:“不,不能这样设计,因为如果对象有自动存储持续时间或者是reinterpret_cast-ed from non - 零初始化存储。”我不允许要求用户每次都进行值初始化。
【问题讨论】:
-
我可以问你为什么它对你很重要吗?我可以想象为什么您可以选择简单地复制。但是为什么可以简单地默认构造呢?它能给你带来什么?
-
@Andrzej 容器(如
optional或variant)应该尽可能通用,不是吗?我尝试设计variantfor constexpr。并且目前具备以上能力。但我认为“也许我应该否认它?”。 -
@Andrzej 最终我在
variant中发现了一个“错误”。默认初始化对象在编译时(constexpr)和运行时具有不同的行为。然后我读到了intiializations。并发现,有 UB 在堆栈上使用我的默认初始化variant。
标签: c++ c++11 c++14 optional variant