我试图理解为什么下面的代码可以编译。我没想到能够构造,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)
[...]为了使引用类型 &'a T 成为“格式良好”(有效),编译器必须知道类型 T “比”生命周期 'a 更长寿——这意味着该类型中包含的所有引用T 必须在生命周期 'a 内有效。因此,例如,类型 i32 的寿命比任何生命周期都长,包括 'static,因为它根本没有引用。
所以我想说你的问题的答案是:是的,任何没有引用(或仅包含静态引用)的类型都满足边界'static。
旁注:根据该 RFC,边界如T: 'static和T: 'a被称为outlives requirements.
| 归档时间: |
|
| 查看次数: |
471 次 |
| 最近记录: |