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) {
| ^^^^^^^^^^^^^^^^^^^^^