主要观点:近期遇到[rust-lang/issues/#24066]并分析底层特征选择机制,解释为何该 bug 导致某代码片段无法编译。
关键信息:
- 在编译器中,
rustc_hir_typeckcrate 处理二进制操作的方法查找,遇到1_u32 + 1_u32时,不是直接查找加u32的方法,而是找加类型推断变量$0的方法,以便根据可用方法借用或获取右值所有权。 rustc_trait_selectioncrate 处理“找加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) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。