note: due to current limitations in the borrow checker, this implies a `'static` lifetime
『E0597 - 参照中の参照先の破棄』の HRTB についての派生パターン。
このエラーは 、HRTB に残る制限の一つ。
エラーメッセージに上記の注釈が含まれるのが特徴になっている。
HRTB によるライフタイムを 'static
で代用できないとエラーになる。
'static
の出所)
'static
は最も広いライフタイムである。そのため、ライフタイムに 'static
が指定できる場合、任意のライフタイムが使える確認になる。逆にそれがエラーとなる場合、その利用状況にライフタイムを狭める境界がある確認になる。つまり、現在の制限はこの性質を流用して実装されている。
HRTB によるライフタイムがライフタイム境界として使われる場合、問題の状況になる場合がある。なぜなら現状、その境界は「どこかから参照可能」ではなく「どこからでも参照可能」を意味する。前者はほぼ境界なしと同じだが、後者はかなり厳しい境界になる。
以下では、関数 with_hrtb
の引数はトレイト Referable<'a>
を実装すべきである。そしてここで、'a
は HRTB によるライフタイムである。そのため、その引数は 'static
を含めてどこからでも参照できなければならない。しかし、実引数 &local
はそうではない。
fn main() {
let local = 1;
with_hrtb(&local);
}
fn with_hrtb<T: for<'a> Referable<'a>>(_: T) {
// nop.
}
trait Referable<'a> {}
impl<'a, T: 'a> Referable<'a> for T {}
error[E0597]: `local` does not live long enough --> src/main.rs:3:15 | 2 | let local = 1; | ----- binding `local` declared here 3 | with_hrtb(&local); | ----------^^^^^^- | | | | | borrowed value does not live long enough | argument requires that `local` is borrowed for `'static` 4 | } | - `local` dropped here while still borrowed | note: due to current limitations in the borrow checker, this implies a `'static` lifetime --> src/main.rs:6:17 | 6 | fn with_hrtb<T: for<'a> Referable<'a>>(_: T) { | ^^^^^^^^^^^^^^^^^^^^^