我正在查看C ++-17 std::optional
类模板的接口,并注意到nullopt
中的reset
和assignment
没有标记为constexpr。
这是疏忽大意还是有原因无法将该操作标记为constexpr?
答案 0 :(得分:9)
有一个原因是[expr.const]以前禁止:
一个赋值表达式或一个赋值运算符([class.copy])的调用将更改联合的活动成员;
由于P1330: Changing the active member of a union inside constexpr的存在,该限制不再存在,这使得所有这些事情都更易于实现(本文从字面上删除了我上面引用的要点)。
optional
的复制和移动分配(但没有其他分配)是constexpr
的原因是,它们仅可用于普通类型。