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

派生パターン