不安全指定寿命的示例有哪些?

时间:2019-11-16 04:38:54

标签: rust lifetime

过去三天,我一直在学习关于终生的话题,现在它们对我来说很有意义。但是,我做了很多实验,但是没有设法指定生存期,否则会导致 runtime -不安全的行为,因为编译器似乎足够聪明,可以防止此类情况的发生。不编译。 因此,我有以下问题链:

Rust编译器是否会捕获每种不安全的生存期说明符使用情况?

  • 如果是,那么为什么Rust可以推断出不安全的情况,从而需要手动指定生存期(如果可以自行指定生存期)?还是仅仅是一个遗物,一旦编译器变得足够强大,可以在任何地方进行生命周期消除,它就会消失吗?
  • 如果否,不安全的生存期说明符用法的示例是什么?他们清楚地证明了手动指定生存期的必要性。

1 个答案:

答案 0 :(得分:2)

除非您在函数中或其他地方使用了不安全的代码,否则不可能(除非出现编译器错误)使用生命周期说明符诱发未定义的行为。但是,仍然需要使用生命周期说明符,因为有时对于适当的生命周期应该存在歧义。例如:

fn foo(bar: &i32, baz: &i32) -> &i32 {
    // ...
}

返回类型的生存期应该是什么?编译器无法推断出这一点,因为它可能绑定到barbaz上,并且每种情况都会影响返回值的持续时间以及函数的使用方式。函数的主体不能用来推断生存期,因为必须仅使用函数的签名就可以完成类型和生存期检查。消除这种歧义的唯一方法是明确声明返回值应具有的生存期:

fn foo<'a>(bar: &i32, baz: &'a i32) -> &'a i32 {
    // ...
}

您可以了解有关生命周期淘汰规则here的更多信息。