为什么要编译这个铁 rust 代码?

use std::fmt::Display;

fn g<T: 'static + Display>(t: T) {
    println!("{}", t);
}

fn t() {
    let x: i32 = 12;
    g(x);
}

fn main() {
    t();
}

当然,在函数t()中,局部变量x不是静态的,然而g的模板规范似乎满足了它必须是静态的要求.我误解了什么?

背景:上面的例子显然是人为设计的.在我正在处理的一个更复杂的设置中,编译器强迫我使用T: 'static而不是只使用T,但我不想只将它用于静态类型.然而,令我惊讶的是,它也适用于非静态变量,我感到困惑……

推荐答案

界限T: 'static意味着T只持有超过'static生存期的引用(或者更一般地,T上的所有生存期参数都超过'static生存期),而不是T必须是静态项.由于i32根本没有引用,这是微不足道的事实.有关参考,请参见the Rust reference和这handy guide, suggested by kmdreko.

Rust相关问答推荐

如何最好地并行化修改同一Rust向量的多个切片的代码?

为什么复印是豆荚的一个重要特征?

这个规则关于或模式到底是什么意思?如果表达片段的类型与p_i|q_i...&q;不一致,就会形成

为什么reqwest以文本形式下载二进制文件?

如何指定不同的类型来常量Rust中的泛型参数?

为什么铁 rust S似乎有内在的易变性?

交换引用时的生命周期

自定义结果枚举如何支持`?`/`FromResidual`?

无法定义名为&new&的关联函数,该函数的第一个参数不是self

如何向下转换到MyStruct并访问Arc Mutex MyStruct实现的方法?

为什么RefCell没有与常规引用相同的作用域?

通过异常从同步代码中产生yield 是如何工作的?

是否可以在不直接重复的情况下为许多特定类型实现一个函数?

结果流到 Vec 的结果:如何避免多个into_iter和collect?

使用占位符获取用户输入

Rust 文件未编译到 dll 中

为什么 Rust 字符串没有短字符串优化 (SSO)?

具有在宏扩展中指定的生命周期的枚举变体数据类型

RAII 模式的 Rust 解决方案,用于在 new() 和 drop() 上修改另一个对象

令人困惑的错误消息? (解包运算符)