【发布时间】:2020-08-17 07:41:43
【问题描述】:
我遇到了一个生命周期错误,我无法解释为什么它是由编译器发出的。我需要这个(效果很好):
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)。
我的理由是,由于f64 是Copy 类型(如果我使用常量值,它确实可以按预期工作),这应该可以工作,因为不应对此值执行释放。
那么问题是为什么编译器会在第二种情况下发出错误?
感谢您的任何指示和解释!
附:我需要 references 上的迭代器,因为它非常适合我的其他 API。
【问题讨论】:
-
Rust 的错误信息通常包含很多有用的信息,所以请阅读它们!鉴于您没有在问题中包含完整的错误消息,并且错误地引用了您确实包含的部分,我认为您没有对错误消息给予太多重视。在这种特殊情况下,错误消息不是很准确,但它确实包含一个提示,并且跟随它会导致更好的错误消息。
-
Rust 的错误信息是我解释的主要来源(这是我使用 Rust 几年后的第一个问题)。我对第一个正在运行的示例感到困惑,并认为发生了一些奇怪的事情。但正如这里的答案解释了为什么第一个示例有效,它现在完全有意义。