error: lifetime may not live long enough
『error - ライフタイムの不足』のサブタイプについての派生パターン。
不変参照と可変参照はサブタイプについて、それぞれ共変と不変である。つまり、S が T のサブタイプなら &S は &T のサブタイプになるが、&mut S は & mut T のサブタイプにはならない。そのため、可変参照にサブタイプによる互換性を想定するとエラーになる。
以下では、Ref<'static> は Ref<'a> のサブタイプなのだが、&'a mut Ref<'static> は &'a mut Ref<'a> のサブタイプではない。そのため、前者の値を後者の値として戻している箇所でエラーになる。
fn func<'a>(arg: &'a mut Ref<'static>) -> &'a mut Ref<'a> {
arg
}
struct Ref<'a>(&'a i32);
error: lifetime may not live long enough
--> src\lib.rs:2:5
|
1 | fn func<'a>(arg: &'a mut Ref<'static>) -> &'a mut Ref<'a> {
| -- lifetime `'a` defined here
2 | arg
| ^^^ returning this value requires that `'a` must outlive `'static`
|
= note: requirement occurs because of a mutable reference to `Ref<'_>`
= note: mutable references are invariant over their type parameter
= help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance
型定義における型パラメタの変性はフィールドの内容により決定される。フィールドがその型パラメタを最初から不変として扱っている場合、またはフィールドごとに扱いが異なる場合、その型パラメタは不変になる。そのため、これらの型パラメタからのサブタイプの波及を想定するとエラーになる。
以下では、型 MyType<T> の型パラメタ T はコールバックの入力と出力の両方に使われているため不変となる。つまり、MyType<&'static str> は MyType<&'a str> のサブタイプではない。そのため、前者の値を後者の値として戻している箇所でエラーになる。
fn func<'a>(arg: &'a MyType<&'static str>) -> &'a MyType<&'a str> {
arg
}
struct MyType<T> {
callback: fn(T) -> T,
}
error: lifetime may not live long enough
--> src\lib.rs:2:5
|
1 | fn func<'a>(arg: &'a MyType<&'static str>) -> &'a MyType<&'a str> {
| -- lifetime `'a` defined here
2 | arg
| ^^^ returning this value requires that `'a` must outlive `'static`
|
= note: requirement occurs because of the type `MyType<&str>`, which makes the generic argument `&str` invariant
= note: the struct `MyType<T>` is invariant over the parameter `T`
= help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance