Rust新手提问:为何可返回局部临时引用的代码能编译通过?
问题解答
这段代码能正常编译的核心原因是Rust的**常量提升(Constant Promotion)**机制:
- 你代码中
&1、&2取的是整型字面量的引用,Rust会自动把所有满足'static约束的常量字面量,提升到全局静态存储区存放,而不是存储在当前函数的栈帧里,不会随函数执行结束被回收。 - 因此你声明的
a、b两个引用,实际类型是&'static i32,'static生命周期的有效范围覆盖整个程序运行周期,自然可以安全地被返回出当前函数作用域。 - 函数返回值声明的生命周期泛型
'a,在调用时会自动匹配实际返回的引用生命周期,'static可以兼容任意生命周期要求,所以生命周期校验可以通过。
你可以尝试修改代码验证这个逻辑,下面的写法就会触发常规的「返回局部变量引用」编译错误:
fn test_Borrowing3<'a>() -> Vec<&'a i32> { let x = 1; let y = 2; let a: &i32 = &x; let b = &y; let aa = vec![a, b]; return aa }
这时候x、y是存放在栈上的局部变量,引用的生命周期只能限制在当前函数内,无法返回出去。
内容的提问来源于stack exchange,提问作者Ken
相关产品推荐
相关产品推荐

