gpt4 book ai didi

generics - 为什么在关联类型上不识别除第一个之外的 super 特征边界?

转载 作者:行者123 更新时间:2023-11-29 08:20:29 25 4
gpt4 key购买 nike

此代码片段在 Rust 1.26.1 中有效:

use std::ops::AddAssign;

trait Trait
where
for<'a> Self: AddAssign<Self> + AddAssign<&'a Self> + Sized,
{
}

trait Trait2 {
type Associated: Trait;

fn method(u32) -> Self::Associated;
}

fn func<T2: Trait2>() {
let mut t = T2::method(1);
let t2 = T2::method(2);
t += &t2;
}

注意 Trait同时实现 AddAssign<Self>AddAssign<&'a Trait> (按照这个顺序,这在后面很重要)。因此,在 func我们知道 t += t2t += &t2应该是有效的。如所见on the playground , t += &t2有效,但是 using t += t2 isn't :

error[E0308]: mismatched types
--> src/main.rs:19:10
|
19 | t += t2;
| ^^
| |
| expected reference, found associated type
| help: consider borrowing here: `&t2`
|
= note: expected type `&<T2 as Trait2>::Associated`
found type `<T2 as Trait2>::Associated`

我读到这个错误是因为编译器没有识别出 AddAssign<Self>T::Associated 实现,这显然是错误的,因为它实现了 Trait ,这需要 AddAssign<Self> .

如果我们改变 AddAssign 的顺序边界 Trait那么相反的成立: t += t2 is valid同时 t += &t2 isn't .

一个快速解决这个问题的方法是制作func generic over both traits :

fn func<T: Trait, T2: Trait2<Associated = T>>() {
let mut t = T2::method(1);
let t2 = T2::method(2);
t += t2;
}

这不是必须的;编译器可以识别 AddAssign 之一s,为什么不是另一个?似乎最后一个边界是要识别的边界。

我的第一个怀疑是这与动态调度有关。我排除了它,因为即使在动态调度中,边界的顺序也不重要。我什至不认为它会使用它,因为在编译时使用单态化所有类型都是已知的。

我目前的怀疑是一个编译器错误,当它是关联类型时,类型检查器不考虑特征边界上的泛型。很容易想象这样一个特定的案例被忽视了。

这是怎么回事?

最佳答案

这是一个已知错误(或几个错误的组合):

  1. Higher-ranked trait bounds on associated types are not elaborated (#50346) .
  2. where clauses are only elaborated for supertraits, and not other things (#20671)
  3. Constraints on associated types declared in subtraits do not propagate. (#32722)
  4. Unrecognized associated type bound on another associated type (#24159)

解决方法是在每个使用站点重申边界:

fn func<T2>()
where
T: Trait2,
T::Associated: Trait,
{
let mut t = T::method(1);
let t2 = T::method(2);
t += &t2;
t += t2;
}

这应该解决 when the type system moves从其临时实现到Chalk ,一个更有原则的求解器,用于解决复杂类型系统产生的问题类型。

关于generics - 为什么在关联类型上不识别除第一个之外的 super 特征边界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51275153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com