类型推断选择了错误的超级特征

Tav*_*nes 5 type-inference rust

这段代码:

trait Foo: PartialOrd + PartialOrd<<Self as Foo>::A> {
    type A;
}

trait Bar {
    type B: Foo;

    fn bar(&self) -> Self::B;
}

fn baz<T: Bar>(x: T, y: T) -> bool {
    x.bar() < y.bar()
}
Run Code Online (Sandbox Code Playgroud)

无法编译并出现此错误:

trait Foo: PartialOrd + PartialOrd<<Self as Foo>::A> {
    type A;
}

trait Bar {
    type B: Foo;

    fn bar(&self) -> Self::B;
}

fn baz<T: Bar>(x: T, y: T) -> bool {
    x.bar() < y.bar()
}
Run Code Online (Sandbox Code Playgroud)

这似乎暗示类型推断正在尝试调用B: PartialOrd<B::A>impl 而不是B: PartialOrd<B>也可用的 impl。

这是一个错误还是只是 Rust 类型推断的(有意/无意)限制?

有没有比这更好的解决方法:

<T::B as PartialOrd>::partial_cmp(&x.bar(), &y.bar()) == Some(Ordering::Less)
Run Code Online (Sandbox Code Playgroud)

Tav*_*nes 1

这是 Rust 的一个错误/限制,已由https://github.com/rust-lang/rust/pull/73905修复。第一个修复此问题的 Rust 版本是 1.49.0。