1. Allow #[may_dangle]
to appear before the generic lifetime of the structure generates a declaration.
struct Foo<#[may_dangle] 's> {...}
If this is done, the dangle of the lifetime 's
will not make the type Foo<'s>
also become dangle.
If this is done, then the use of the lifetime 's
within the structure Foo
can only be done using the method of #[may_dangle]
.
struct Bar<#[may_dangle] 's> {...}
struct Foo<#[may_dangle] 's> {
bar: Bar<'s>,
}
Normal use will be rejected by the compiler:
struct Foo<#[may_dangle] 's> {
bar: &'s i32,
// ^^^^^^^ &'s i32 not allow 's dangle
}
The survival time of a structure is independent of its lifetime 's
.
Foo<'s>: 'static
2. Allow #[may_dangle]
to modify any type
Make #[may_dangle] &'s i32
a legal type:
fn foo<#[may_dangle] 's>(x: #[may_dangle] &'s i32) {...}
Values with type #[may_dangle] T
can only be copied (if T
can be copied) and moved, and cannot read members or call methods.
Therefore, x
cannot be dereferenced.
Types with #[may_dangle]
modification can also serve as member types of structural entities.
struct Foo<#[may_dangle] 's> {
bar: #[may_dangle] &'s i32,
}
The survival time of #[may_dangle] T
is 'static
#[may_dangle] T: 'static
3. Using a value of #[may_dangle]
will not result in an extension of the lifetime
fn foo<#[may_dangle] 's>(x: #[may_dangle] &'s i32) {...}
let a: #[may_dangle] &i32;
{
let x = 1;
a = &x;
}
foo(a);