为什么std :: ops :: Shl :: shl不等于&lt; <! - ?

时间:2018-04-09 10:21:50

标签: types rust

mutagen中,我使用专门化进行变异 尽可能的二元运算。基本上,我用a + b替换 ::mutagen::AddSub::add(a, b, mutation_count)唉,它在场时失败了 转移操作,因为类型推断失败。

我已将问题简化为非常简单的测试用例:

use std::ops::Shl;

fn main() {
    println!("{}", 1u32.shl(2) * 3);
}

error[E0277]: cannot multiply i32 to u32失败。这似乎是 因为std::ops::Shl是针对各种整数实现的,所以会发生这种情况 而那些impl总是返回自我类型(但不是自我,正如我所看到的那样) 来源),typeck可能看不到它们,并且空洞,默认 到i32。如果您将1u32.shl(2)替换为(1u32 << 2),则可以。

因此转发std::ops::Shl / Shr无法使用自定义特征 (如在pub trait AddSub中)或在左侧使用包装类型 操作。在这两种情况下,类型推断都无法看到相等的 SelfSelf::Output用于整数转换,尽管知道Self

这是一个错误吗?有解决方法吗?是什么原因造成的?

1 个答案:

答案 0 :(得分:5)

这不是错误。原因是一些special binary operations handling for non (or semi-)inferred types in typeck

解决方法是使用if表达式修复表达式的返回类型,其中一个分支是原始二进制操作,另一个是变异操作,例如

(if ::mutagen::now(42) {
     ::mutagen::ShlShr::shl(left, right)
 } else {
     left << right
 })