标准规定了 optional
的移动赋值运算符必须...
constexpr optional& operator=( optional&& other )
只有当is_move_constructible_v 为true且is_move_assignable_v 为true时,才能参与过载解析。
可选值的赋值lhs = rhs; 要么销毁lhs(如果bool(lhs)&&!bool(rhs)),要么从rhs构造lhs(如果!bool(lhs)&& bool(rhs)),或将rhs分配给lhs(如果bool(lhs)&& bool(rhs))。
因此,移动可选项的赋值可能有两组前提条件:
1. is_move_constructible_v && is_move_assignable_v 2. is_move_constructible_v && is_copy_assignable_v 第二种形式可以使用复制赋值(如果bool(lhs)&& bool(rhs)),但是如果!bool(lhs)&& bool(rhs),则进行移动构造。
我认为当前的前提条件在以下两类类型方面存在明显的人为问题:
1. 既不可移动赋值也可复制赋值,移动构造和复制构造可行的类型不能从赋值的移动构造中受益。 将选择optional的复制赋值运算符并复制构造或复制分配该值。 2. 既不可复制构造也不可移动赋值,但可移动构造和可复制赋值的类型根本无法分配。
这是否在optional的标准化过程中被考虑过,或者是否有任何理由未被考虑或已被放弃?
(免责声明:我知道如果显式删除移动赋值运算符,则is_move_assignable通常为true。)