过去三天,我一直在学习关于终生的话题,现在它们对我来说很有意义。但是,我做了很多实验,但是没有设法指定生存期,否则会导致 runtime -不安全的行为,因为编译器似乎足够聪明,可以防止此类情况的发生。不编译。 因此,我有以下问题链:
Rust编译器是否会捕获每种不安全的生存期说明符使用情况?
答案 0 :(得分:2)
除非您在函数中或其他地方使用了不安全的代码,否则不可能(除非出现编译器错误)使用生命周期说明符诱发未定义的行为。但是,仍然需要使用生命周期说明符,因为有时对于适当的生命周期应该存在歧义。例如:
fn foo(bar: &i32, baz: &i32) -> &i32 {
// ...
}
返回类型的生存期应该是什么?编译器无法推断出这一点,因为它可能绑定到bar
或baz
上,并且每种情况都会影响返回值的持续时间以及函数的使用方式。函数的主体不能用来推断生存期,因为必须仅使用函数的签名就可以完成类型和生存期检查。消除这种歧义的唯一方法是明确声明返回值应具有的生存期:
fn foo<'a>(bar: &i32, baz: &'a i32) -> &'a i32 {
// ...
}
您可以了解有关生命周期淘汰规则here的更多信息。