#[derive(Debug)] struct Foo {} fn foo<'a>() -> &'a Foo { let foo = &Foo {}; foo } fn main() { dbg!(foo()); } この例ではコンパイルはできる、というのが答えです。 この記事では「なぜコンパイルできるのか」について解説していきます。 コンパイルできる理由 Rvalue static promotionにより、Fooは静的領域に保持され、どこからでも参照できるためです。 Rvalue static promotionとは 簡潔に説明すると「コンパイル時に確定できる値かつその値は不変」の場合は静的領域に値を確保し、参照できるようにする rvalueというのは place expression 以外の式のことを指す place expression というのはメモリ位置を表現した式のこと たと