Reference 为什么我可以返回对本地文本的引用而不是变量的引用?

Reference 为什么我可以返回对本地文本的引用而不是变量的引用?,reference,rust,borrow-checker,Reference,Rust,Borrow Checker,这段代码为什么要编译 fn get_iter() -> impl Iterator<Item = i32> { [1, 2, 3].iter().map(|&i| i) } fn main() { let _it = get_iter(); } fn get_iter()->impl迭代器{ [1,2,3].iter().map(|&i|i) } fn main(){ 让它=得到它(); } [1,2,3]是一个局部变量,iter()借用了它。此代

这段代码为什么要编译

fn get_iter() -> impl Iterator<Item = i32> {
    [1, 2, 3].iter().map(|&i| i)
}

fn main() {
    let _it = get_iter();
}
fn get_iter()->impl迭代器{
[1,2,3].iter().map(|&i|i)
}
fn main(){
让它=得到它();
}

[1,2,3]
是一个局部变量,
iter()
借用了它。此代码不应编译,因为返回值包含对局部变量的引用。

在您的示例中,
[1,2,3]
不被视为局部变量,而被视为静态变量

让我们看看这段代码:

fn foo() -> &'static [i32] {
    &[1, 2, 3]
}
这管用

不久前,合并了:“将constexpr值提升为静态内存中的值,而不是堆栈插槽中的值”。这意味着,基本上你写的所有文字都可以永远存在。因此,类似于
let&uu:&'static i32=&42也可以工作

如果我们避免使用文字数组,我们可以看到预期的错误:

fn bar() -> impl Iterator<Item = i32> {
    vec![1, 2, 3].iter().map(|&i| i)
}


除了文字,这也适用于标准库中的少量函数。决定任意
const
函数的结果是否可以自动升级为
静态
仍然是一个难题。

看来
const
变量已经过时:p@Boiethios这是一个有趣的想法。你找到可以链接的讨论了吗?@Boiethios它们不是过时的。这只适用于文本。有时您需要一个必须计算的常量。@Boiethios在静态内存中存储数据有一些缺点,特别是如果数据很大,并且在程序的整个生命周期中不需要。确实有些时候你应该选择这种行为。@Alexey是的,语言模型就是这么说的。但是,优化器以后仍然可以内联该值。
fn promote_integer() -> &'static i32 {
    &42
}
fn promote_float() -> &'static f64 {
    &42.42
}
fn promote_str() -> &'static str {
    "Hello World!"
}
struct Foo(char);

fn promote_struct() -> &'static Foo {
    &Foo('x')
}