标准要求 optional
的 move 赋值运算符...
constexpr optional& operator=( optional&& other )
[...] shall not participate in overload resolution unless
is_move_constructible_v<T>
is true andis_move_assignable_v<T>
is true.
可选值的赋值lhs = rhs;
要么
- 销毁
lhs
(如果bool(lhs) && !bool(rhs)
) - 施工
lhs
来自rhs
(如果!bool(lhs) && bool(rhs)
)或 - 分配
rhs
至lhs
(如果bool(lhs) && bool(rhs)
)。
因此,可以选择为 optional
的 move 分配设置两组先决条件:
-
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)
则 move 施工.
对于以下两类类型,我发现当前的先决条件集存在一个公认的相当人为的问题:
不可 move 赋值但可复制赋值、可 move 构造和可复制构造的类型无法从赋值 move 构造中获益,即使构造是赋值操作的一部分。
optional
将选择复制赋值运算符并复制构造或复制赋值。既不可复制构造也不可 move 赋值但可 move 构造且可复制赋值的类型根本不能赋值。
在 optional
的标准化过程中是否考虑到了这一点?或者有什么理由不考虑或放弃它?
(免责声明:我知道如果 is_move_assignable
为真,则 is_copy_assignable
通常为真,除非明确删除 move 赋值运算符。)
最佳答案
您应该考虑使用 std::optional::emplace对于可 move 构造类型(第二种情况)
关于c++ - 为什么 std::optional 不允许对 "move construct and copy assign only"类型进行 move 赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55229833/