以下の Rust のコードはコンパイルできる。
fn f<T: 'static> (_: T) {} fn main() { let s1: &'static str = "static"; f(s1); let s2: String = String::from("string"); f(s2); }
f に s1 を渡せるのは、よくわかる。 &'static なのだから、 T: 'static を満たすのは当然と言えよう。
しかし、 s2 はどうだろうか? 'static とは思えない。 lifetime が 'static というのは、 ChatGPT4 さんによれば、「参照されるデータ自体がプログラムの実行期間全体で生存する」ことらしい。 s2 は関数内で定義したローカル変数なので、スコープを外れれば削除されてしまうように思える。この例ではたまたま main 関数で定義しているので、プログラムの実行期間全体で生存すると言えばそう言えるのかもしれないのだが、別に main 関数ではなくてもこの結果は変わらない。
この件について ChatGPT4 さんと小一時間議論したのだが、スッキリした回答は得られなかった。そこで Rust のドキュメントにあたったところ、単純明快な回答が書かれていた。
T: 'a means that all lifetime parameters of T outlive 'a.
つまり、これは逆を言えば、 lifetime parameters を持たない型は任意の 'a 制約を満たすし、当然 'static 制約も満たすのだ。なるほど。