rust - 了解 Rust 中参数化结构的生命周期

标签 rust dereference lifetime

以下代码

struct Cat<'a, T> {
    coolness: &'a T,
}

提示说

error[E0309]: the parameter type `T` may not live long enough
 --> src/main.rs:2:5
  |
1 | struct Cat<'a, T> {
  |                - help: consider adding an explicit lifetime bound `T: 'a`...
2 |     coolness: &'a T,
  |     ^^^^^^^^^^^^^^^
  |
note: ...so that the reference type `&'a T` does not outlive the data it points at
 --> src/main.rs:2:5
  |
2 |     coolness: &'a T,
  |     ^^^^^^^^^^^^^^^

在明确的生命周期限制下,它可以编译。当我实例化其中 T&i32 的结构时,尽管每个引用具有不同的生命周期,但代码都会编译。我的理解是,编译器认为内部 & 比外部 & 生命周期更长:

struct Cat<'a, T>
where
    T: 'a,
{
    coolness: &'a T,
}

fn main() {
    let b = 10;
    {
        let c = &b;
        {
            let fluffy = Cat { coolness: &c };
        }
    }
}

Cat {coolness: &c } 是否扩展为 Cat {coolness: &'a &'a i32 }?对于更多嵌套引用,内部引用是否也假设具有相同的生命周期等等?

最佳答案

Does Cat { coolness: &c } expand to Cat { coolness: &'a &'a i32 }?

是的,Cat以对引用的引用结束。这可以通过以下代码编译来证明:

let fluffy = Cat { coolness: &c };
fn is_it_a_double_ref(_x: &Cat<&i32>) {}
is_it_a_double_ref(&fluffy);

但是,每个引用的生命周期不一定相同。

My understanding is that the compiler sees that the inner & outlives the outer &

没错。而这正是 T: 'a 所在的位置。绑定(bind)开始发挥作用。

生命周期一开始有点难以理解。他们对T中包含的引用进行了限制。 。例如,给定边界 T: 'static ,不包含任何引用或仅包含 'static 的类型引用文献,例如i32&'static str ,满足边界,而包含非 'static 的类型引用文献,例如&'a i32 ,不要,因为'a: 'static是假的。更一般地说,给定界限 T: 'a ,类型T对于每个生命周期参数 'x 满足边界条件上T , 'x: 'a为 true(没有生命周期参数的类型通常满足界限)。

现在回到您的代码。让我们给这些引用文献起一些名字。我们会说 coolness 的类型是 &'fluffy &'c i32'c是变量 c 的生命周期和'fluffy是变量 fluffy 的生命周期(与直觉相反,生命周期编码借用的范围,而不是引用对象的生命周期,尽管编译器确实检查借用不会超出引用对象的生命周期)。这意味着 Fluffy 的类型是 Cat<'fluffy, &'c i32> 。是真的吗&'c i32: 'fluffy

检查是否&'c i32: 'fluffy是 true,我们需要检查是否 'c: 'fluffy是真的。 'c: 'fluffy为 true,因为变量 c fluffy 之后超出范围.

关于rust - 了解 Rust 中参数化结构的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49093143/

相关文章:

reference - 为什么 &mut 的引用弱化发生在某些特征方法调用中?

rust - 在rust中有多种返回类型

c - 如何从结构指针数组中取消引用

rust - 生命周期不会延长,但只有当结构中有一个特征对象时

rust - 为什么在使用 f64::from_bits 时在 float 组上调用 iter 会给出 "temporary value is freed"?

rust - 为什么 Rust 有 struct 和 enum?

rust - 索引字符串

C++:如何使用名称长度从内存中的字符指针中取消引用多个字符

C++ ISO 对指向基的解除引用指针的标准解释

rust - 为 FFI 返回具有生命周期的结构