constexpr std::optional 重置

constexpr std::optional reset

我正在审查 C++-17 std::optional class 模板的接口,并注意到 nullopt 中的 reset and assignment 未标记为 constexpr。

这是疏忽还是无法将此操作标记为 constexpr 的原因?

有一个原因,就是[expr.const]之前禁止的:

an assignment expression or invocation of an assignment operator ([class.copy]) that would change the active member of a union;

由于 P1330: Changing the active member of a union inside constexpr,该限制不再存在,这使得所有这些事情更容易实现(这篇论文实际上只是删除了我上面引用的要点)。

optional 的复制和移动赋值(但 none 的其他赋值)是 constexpr 的原因是因为它们只能默认为普通类型。