c++ - 为什么 std::optional 不允许“移动构造和仅复制分配”类型的移动分配?
问题描述
该标准要求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
为真,除非明确删除移动赋值运算符。)
解决方案
您应该考虑将std::optional::emplace用于可移动构造类型(第二种情况)
推荐阅读
- java - 使用自由服务器的 Grails 应用程序中的 UnknownHostException
- python - pandas ValueError:转换无法产生聚合结果
- ruby - 在没有互联网的 cent OS 7.5 上安装 Puppet 代理 3.8 时出错
- javascript - 有没有办法从数组中取出对象并放入新数组中?
- javascript - 如何根据所选下拉列表的值隐藏和显示 div -JQuery 和 Javascript
- highcharts - highcharts中的数据标签
- angularjs - 错误 TS1128:.map() 运算符需要声明或语句
- javascript - 如何配置 TypeScript 以针对不正确的导入语句引发错误/警告?
- javascript - How to fill in missing months in an array using javascript
- java - 如何在清单中链接外部 Spring Boot JAR (NoClassDefFoundError)