[英]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);
}
您可以将类型绑定到T: 'x
看作是“ T
实例不会突然失效,因为删除了寿命短于'x
”。 但是,这不会影响T
实例本身的寿命。
因此,如果删除了所引用的内容,则该引用将无效。 这意味着在'static
的情况下,对于程序的整个运行,所引用的事物必须至少生存与'x
一样长的时间。
但是拥有所有数据的i32
对象(例如, i32
或String
永远不会因为其他对象被丢弃而无效。 整数在丢弃之前是好的。 因此,它满足'static
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.