理解一个特性选择错误

主要观点:近期遇到[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相加的情况。
阅读 20
0 条评论