impl Iterator { [3.14].iter() } 但是,当我尝试-6ren">
gpt4 book ai didi

rust - 为什么在使用 f64::from_bits 时在 float 组上调用 iter 会给出 "temporary value is freed"?

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

我遇到了一个生命周期错误,我无法解释为什么它是由编译器发出的。我需要这个(效果很好):

fn iter<'a>() -> impl Iterator<Item = &'a f64> {
[3.14].iter()
}
但是,当我尝试使用浮点值时,该值是使用 from_bits 从特定字节表示转换而来的。 , 像这样:
fn iter<'a>() -> impl Iterator<Item = &'a f64> {
[f64::from_bits(0x7fffffffffffffff)].iter()
}
它给了我“创建一个临时的,在使用中被释放”。游乐场 here (稳定 1.45.2)。
我的理由是,自从 f64Copy类型(如果我使用常量值,它确实可以按预期工作),这应该可以工作,因为不应对此值执行释放。
所以问题是为什么编译器会在第二种情况下发出错误?
感谢您的任何指示和解释!
附言我需要迭代器而不是引用,因为它非常适合我的其他 API。

最佳答案

您的代码有两个相关的问题:

  • 您返回对在函数体末尾超出范围的临时对象的引用。
  • 您的返回类型包含一个未绑定(bind)到任何函数输入的生命周期参数。

  • 引用只能与它们指向的数据一样长。方法调用的结果 f64::from_bits(0x7fffffffffffffff)是一个临时对象,在表达式末尾超出范围。从函数返回对临时值或局部变量的引用是不可能的,因为一旦函数返回,所引用的值将不再存在。 Copy trait,或者对象是否存储在堆上,与超出范围的值不能再被引用这一事实完全无关。在函数内部创建的任何值都将在函数体末尾超出范围,除非您通过返回值将其移出函数。但是,您需要移动值的所有权才能使其正常工作——您不能简单地返回引用。
    由于您不能返回对函数内部创建的任何值的引用,因此返回值中的任何引用都必须引用通过函数参数传入的内容。这意味着返回值中任何引用的生命周期都需要与传递给函数的某些引用的生命周期相匹配。这让我们来到了第二点——一个只出现在返回类型中的生命周期参数总是一个错误。生命周期参数由调用代码选择,因此您实际上是在说您的函数返回一个在调用者选择的任意时间内存在的引用,这只有在引用引用与程序一样长的静态数据时才有可能.
    这也解释了为什么您的第一个示例有效。字面量 [3.14]定义一个常量静态数组。该数组将与程序一样长,因此您可以将具有任意生命周期的引用返回给它。但是,您通常会通过显式指定静态生命周期来表达这一点,以明确发生了什么:
    fn iter() -> impl Iterator<Item = &'static f64> {
    [3.14].iter()
    }
    只出现在返回值中的生命周期参数是没有用的。
    那么你如何解决你的问题呢?您可能需要在拥有的类型上返回一个迭代器,因为您的 iter()函数不接受任何参数。

    关于rust - 为什么在使用 f64::from_bits 时在 float 组上调用 iter 会给出 "temporary value is freed"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63446602/

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