以下の内容はhttps://hiratara.hatenadiary.jp/entry/2024/01/29/224152より取得しました。


ライフタイム制約と所有権の移動

以下の Rust のコードはコンパイルできる。

fn f<T: 'static> (_: T) {}

fn main() {
    let s1: &'static str = "static";
    f(s1);

    let s2: String = String::from("string");
    f(s2);
}

fs1 を渡せるのは、よくわかる。 &'static なのだから、 T: 'static を満たすのは当然と言えよう。

しかし、 s2 はどうだろうか? 'static とは思えない。 lifetime が 'static というのは、 ChatGPT4 さんによれば、「参照されるデータ自体がプログラムの実行期間全体で生存する」ことらしい。 s2 は関数内で定義したローカル変数なので、スコープを外れれば削除されてしまうように思える。この例ではたまたま main 関数で定義しているので、プログラムの実行期間全体で生存すると言えばそう言えるのかもしれないのだが、別に main 関数ではなくてもこの結果は変わらない。

この件について ChatGPT4 さんと小一時間議論したのだが、スッキリした回答は得られなかった。そこで Rust のドキュメントにあたったところ、単純明快な回答が書かれていた。

doc.rust-lang.org

T: 'a means that all lifetime parameters of T outlive 'a.

つまり、これは逆を言えば、 lifetime parameters を持たない型は任意の 'a 制約を満たすし、当然 'static 制約も満たすのだ。なるほど。




以上の内容はhttps://hiratara.hatenadiary.jp/entry/2024/01/29/224152より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14