标准要求optional
...
constexpr optional& operator=( optional&& other )
[...]不得参与重载决议,除非
is_move_constructible_v<T>
为真,is_move_assignable_v<T>
为真。
分配可选值lhs = rhs;
可以实现
lhs
(如果bool(lhs) && !bool(rhs)
)lhs
(如果为rhs
)的!bool(lhs) && bool(rhs)
或rhs
分配给lhs
(如果bool(lhs) && bool(rhs)
)。因此,optional
的移动分配具有两个前提条件是一种选择:
is_move_constructible_v<T> && is_move_assignable_v<T>
is_move_constructible_v<T> && is_copy_assignable_v<T>
如果bool(lhs) && bool(rhs)
,第二种形式可以使用副本分配,如果!bool(lhs) && bool(rhs)
,则可以移动构造。
对于以下两类类型,我认为当前的前提条件是一个公认的相当人为的问题:
虽然赋值操作是构造的一部分,但不可赋值但可复制赋值,可移动赋值和可复制赋值的类型不能从赋值转移结构中受益。 optional
副本分配运算符将被选择,并为副本构造或副本分配值。
既不能复制构造也不能移动分配,但不能移动构造但不能移动分配的类型。
在optional
的标准化过程中是否已经考虑过这一问题?还是没有理由不考虑或放弃该问题?
(免责声明:除非is_move_assignable
为true,否则除非明确删除移动分配运算符,否则is_copy_assignable
通常为true。)