主要观点:近期遇到[rust-lang/issues/#24066]并分析底层特征选择机制,解释为何该 bug 导致某代码片段无法编译。
关键信息:
- 在编译器中,
rustc_hir_typeck
crate 处理二进制操作的方法查找,遇到1_u32 + 1_u32
时,不是直接查找加u32
的方法,而是找加类型推断变量$0
的方法,以便根据可用方法借用或获取右值所有权。 rustc_trait_selection
crate 处理“找加u32
和类型推断变量$0
的方法”的请求,where 子句中的特征优先级更高。- 对于
1_u32 + 1_u32
,选择了加u32
和类型变量T
的方法,导致类型不匹配错误,这是编译器倾向于安全性而非完整性的例子。
重要细节: - 代码片段
fn add<T>() where u32: std::ops::Add<T, Output = T> { let _ = 1_u32 + 1_u32; }
无法编译,出现类型不匹配错误。 - 编译器在处理二进制操作时的特殊行为及相关 crate 的作用。
- 后来指出加法总是获取右值所有权,使用推断变量是为了处理强制转换,如
String
和&String
相加的情况。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。