Прежде чем я наткнулся на приведенный ниже код, я был убежден, что срок жизни в параметре lifetime всегда будет переживать свои собственные экземпляры. Другими словами, при a foo: Foo<'a>
, тогда 'a
всегда будет переживать foo
. Затем я познакомился с этим кодом встречного аргумента @Luc Danton (Игровая площадка):
#[derive(Debug)]
struct Foo<'a>(std::marker::PhantomData<fn(&'a ())>);
fn hint<'a, Arg>(_: &'a Arg) -> Foo<'a> {
Foo(std::marker::PhantomData)
}
fn check<'a>(_: &Foo<'a>, _: &'a ()) {}
fn main() {
let outlived = ();
let foo;
{
let shortlived = ();
foo = hint(&shortlived);
// error: `shortlived` does not live long enough
//check(&foo, &shortlived);
}
check(&foo, &outlived);
}
Несмотря на то, что foo
, созданный hint
, рассматривается как время жизни, которое не живет так долго, как оно есть, а ссылка на него передается функции в более широкой области, код компилируется точно так же, как и является. Разоблачение строки, указанной в коде, вызывает ошибку компиляции. Альтернативно, изменение foo
на struct tuple (PhantomData<&'a ()>)
также заставляет код больше не компилироваться с такой же ошибкой (Playground).
Как это действует Код ржавчины? Что такое аргумент компилятора здесь?