Это утверждение относится к типовой дисперсии, которая представляет собой сложную концепцию отношений между типами, на самом деле это особый вид подтипов.
Ваш пример не содержит дисперсии. Он сокращается до:
fn test1<'x, 'y>(a: &'x TestVec<&'y str>)
И когда вы вызываете эту функцию с помощью v: TestVec<&'static str>
, время жизни 'x
преобразуется в v
, а 'y
равно 'static
. Здесь нет вариации типов, только обобщения.
Но рассмотрим другой пример, требующий вариации:
fn test2<'x>(a: &TestVec<&'x str>, b: &TestVec<&'x str>) {}
fn test_variance<'a>() {
let v1:TestVec<&'static str> = TestVec::new();
let v2:TestVec<&'a str> = TestVec::new();
test2(&v1, &v2);
}
Теперь компилятор должен решить 'x
как самое короткое время жизни 'a
и 'static
, это должно быть просто 'a
из-за дисперсии. Но *mut T
в TestVec
вызывает эту ошибку:
cannot infer an appropriate lifetime for lifetime parameter 'a in function call due to conflicting requirement
...
= note: expected `&TestVec<&str>`
found `&TestVec<&'static str>`
Затем, как объясняет Nomicon, изменение *mut T
на *const T
заставляет его снова работать.