这是一系列后续帖子中的第一篇,主要围绕对“Claiming, auto and otherwise”的设计进行澄清和调整。
- TL;DR:人们喜欢它:人们喜欢使处理引用计数或可廉价克隆数据更便捷的想法,很多人表达了兴奋之情,可阅读Conclusion以更好理解。
- 澄清特质的关系:用维恩图展示
Copy/Clone/Claim
特质的关系,Clone
最通用,Copy
代表可通过memcpy
复制且无析构函数的“普通旧数据”,Claim
代表克隆廉价、无错且透明的值,二者有重叠但无严格层级关系。 - 关于启发式:
Claim
特质的实现涉及一些启发式问题,如“什么是廉价?”“什么是无错?”“什么是透明?”等,当前的copy/clone
分割就是因难以确定界限而产生,“廉价、无错、透明”虽不精确但代表了自动声明时的理想标准,Claim
不应作为函数的绑定。 - “无错”应改为“不展开”:原定义中“无错”意为“不能恐慌或中止”,但标准库中的
Arc
和Rc
在引用计数超过std::usize::MAX
时会中止,因此“无错”应改为“声明操作不应恐慌”,且若自动claim
操作展开应让编译器插入中止。 - 澄清
claim
代码生成:编译器在已知被声明类型实现Copy
时,在单态化时仍使用memcpy
,通过if impl
表达式实现更优化的代码生成,定义use_claim_value
函数来控制claim
的代码插入。 - 结论:提议改变 Rust 中“按值使用某物”的含义,若
SomeType: Claim
,x
被“声明”可继续使用,否则被“移动”,“声明”大致相当于调用x.claim()
,实际更高效,此改变旨在保留 Rust 的一致性并弥补当前规则的不足。同时提到可将[RFC #3288]扩展到编译器自动调用的所有操作,以及 specialization 虽有“空头支票”声誉但仍值得添加。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。