首页 > 解决方案 > 为什么 std::optional 不允许“移动构造和仅复制分配”类型的移动分配?

问题描述

该标准要求optional...的移动赋值运算符

constexpr optional& operator=( optional&& other )

is_move_constructible_v<T>[...] 除非为真且为真,否则不应参与重载决议 is_move_assignable_v<T>

lhs = rhs;可选值的分配

因此,可以选择为 的移动分配设置两组先决条件optional

  1. is_move_constructible_v<T> && is_move_assignable_v<T>
  2. is_move_constructible_v<T> && is_copy_assignable_v<T>

第二种形式可以使用复制赋值 ifbool(lhs) && bool(rhs)但移动构造 if !bool(lhs) && bool(rhs)

对于以下两类类型,我认为当前的一组先决条件存在一个公认的相当人为的问题:

  1. 即使构造是赋值操作的一部分,一个不可移动赋值但可复制赋值、可移动构造和可复制构造的类型不能从赋值时的移动构造中受益。将optional选择复制赋值运算符并复制构造或复制赋值。

  2. 一个既不能复制构造也不能移动赋值但移动构造和复制赋值的类型根本不能被赋值。

这是在标准化过程中考虑过的事情optional吗?或者是否有任何理由不考虑或放弃它?

(免责声明:我知道如果为真is_move_assignable则通常is_copy_assignable为真,除非明确删除移动赋值运算符。)

标签: c++c++17move-semanticsstdoptional

解决方案


您应该考虑将std::optional::emplace用于可移动构造类型(第二种情况)


推荐阅读