非引用类型是否始终满足“静态”生命周期?

Eva*_*van 3 lifetime rust

我试图理解为什么下面的代码可以编译。我没想到能够构造,Wrapper<String>因为T: 'static运行时分配的字符串不会在程序的整个生命周期中存在。

我认为允许这样做的原因是因为我设置T为非引用类型(String)。当我使用&str, 或包含引用的结构时,编译器会发出我期望的错误。

然而,我在 Rust 文档中找不到任何可以证实我的假设的内容,所以也许我没有完全理解规则。所有非引用类型是否都满足 的'static生命周期限制Wrapper<T>,还是有一些类型会失败?

use rand::Rng;

struct Wrapper<T>
where
    T: 'static,
{
    value: T,
}

fn wrap_string() -> Wrapper<String> {
    // Use rng to avoid construcing string at compile time
    let mut rng = rand::thread_rng();
    let n: u8 = rng.gen();
    let text = format!("The number is {}", n);
    Wrapper { value: text }
}

fn main() {
    let wrapped = wrap_string();
    std::mem::drop(wrapped);
}
Run Code Online (Sandbox Code Playgroud)

Ali*_*air 5

来自RFC 2093 的背景部分

[...]为了使引用类型 &'a T 成为“格式良好”(有效),编译器必须知道类型 T “比”生命周期 'a 更长寿——这意味着该类型中包含的所有引用T 必须在生命周期 'a 内有效。因此,例如,类型 i32 的寿命比任何生命周期都长,包括 'static,因为它根本没有引用。

所以我想说你的问题的答案是:是的,任何没有引用(或仅包含静态引用)的类型都满足边界'static

旁注:根据该 RFC,边界如T: 'staticT: 'a被称为outlives requirements.