gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:25:17 25 4
gpt4 key购买 nike

为什么这段代码会编译?

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

fn main() {
let _it = get_iter();
}
[1, 2, 3]是局部变量和 iter()借它。此代码不应编译,因为返回值包含对局部变量的引用。

最佳答案

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

我们来看看这段代码:

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

这有效!

前段时间, RFC 1414: Rvalue Static Promotion合并:“将 constexpr 右值提升为静态内存中的值而不是堆栈槽”。这意味着基本上你写的所有文字都可以永远存在。因此,诸如 let _: &'static i32 = &42; 之类的东西也工作!

如果我们避免使用文字数组,我们可以看到预期的错误:
fn bar() -> impl Iterator<Item = i32> {
vec![1, 2, 3].iter().map(|&i| i)
}

在这里我们得到“ v 生命周期不够长”错误。

这不仅限于整数或数组;它广泛适用于任何仅由文字组成的文字:
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')
}

除了文字,这也适用于标准库中的少数函数, but these were likely a mistake .判断是否为任意结果 const功能可自动提升到 static仍然是 open topic .

关于reference - 为什么我可以返回对本地文字的引用而不是变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61283566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com