繁体   English   中英

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

[英]Do non-reference types always satisfy a lifetime of 'static?

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

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

但是,我无法在Rust文档中找到任何可以证实我的假设的东西,所以也许我不完全了解规则。 所有非引用类型是否都将满足Wrapper<T>上的'static生存期限制”,还是会失败?

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);
}

RFC 2093背景部分

[...]为了使引用类型&'T能够“良好地形成”(有效),编译器必须知道类型T在“寿命” a之上“生存”-意味着该类型中包含的所有引用T必须在有效期'a内有效。 因此,例如,由于类型i32根本没有引用,因此它的生存期都超过了所有寿命,包括“静态”。

因此,我想回答的问题是:是的,任何没有引用(或仅包含静态引用)的类型都满足'static

旁注:根据该RFC,像T: 'staticT: 'a类的界限被称为outlives requirements

您可以将类型绑定到T: 'x看作是“ T实例不会突然失效,因为删除了寿命短于'x ”。 但是,这不会影响T实例本身的寿命。

因此,如果删除了所引用的内容,则该引用将无效。 这意味着在'static的情况下,对于程序的整个运行,所引用的事物必须至少生存与'x一样长的时间。

但是拥有所有数据的i32对象(例如, i32String永远不会因为其他对象被丢弃而无效。 整数在丢弃之前是好的。 因此,它满足'static

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM