该标准要求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
(if )构造!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>
第二种形式可以使用复制赋值 ifbool(lhs) && bool(rhs)
但移动构造 if !bool(lhs) && bool(rhs)
。
对于以下两类类型,我认为当前的一组先决条件存在一个公认的相当人为的问题:
即使构造是赋值操作的一部分,一个不可移动赋值但可复制赋值、可移动构造和可复制构造的类型不能从赋值时的移动构造中受益。将
optional
选择复制赋值运算符并复制构造或复制赋值。一个既不能复制构造也不能移动赋值但移动构造和复制赋值的类型根本不能被赋值。
这是在标准化过程中考虑过的事情optional
吗?或者是否有任何理由不考虑或放弃它?
(免责声明:我知道如果为真is_move_assignable
则通常is_copy_assignable
为真,除非明确删除移动赋值运算符。)