【问题标题】:constexpr std::optional resetconstexpr std::可选重置
【发布时间】:2019-05-21 10:08:59
【问题描述】:

我正在查看 C++-17 std::optional 类模板的接口,并注意到来自 nulloptresetassignment 未标记为 constexpr。

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

【问题讨论】:

  • 如果为真,则不能将赋值运算符标记为 constexpr。 std::optional 有几个这样的赋值运算符。

标签: c++ c++17 constexpr stdoptional


【解决方案1】:

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

赋值表达式或赋值运算符 ([class.copy]) 的调用会更改联合的活动成员;

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

optional 的复制和移动分配(但没有其他分配)是constexpr 的原因是因为它们只能被默认为普通类型。

【讨论】:

  • 既然我们有了 P1330,有没有论文可以让optionals 函数 constexpr?
  • @Rakete1111 我不知道 - 想写吗?
  • 跟进:有了它,就可以完全实现constexprstd::optional,对吗?为什么标准实现首先使用union(例如,支持std::aligned_storage或只是原始字节)?
  • @m8mble 是的。并且不能在 constexpr 中使用任何类型的reinterpret_cast
  • @Rakete1111 好的,now there is
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 2021-11-14
  • 2012-12-25
  • 2019-05-27
  • 1970-01-01
相关资源
最近更新 更多