Temporary lifetimes sometimes yield surprising errors · Issue #46413 · rust-lang/rust (original) (raw)
Navigation Menu
- Explore
- Pricing
Provide feedback
Saved searches
Use saved searches to filter your results more quickly
Appearance settings
Description
UPDATE: The main remaining issue seems to be that the NLL checker is correctly identifying cases where temporary lifetimes are acting in surprising ways -- some of these were overlooked by the borrow checker. The only fix is to adjust the temporary lifetime rules, which would be technically backwards incompatible, but maybe something we could get away with. See this comment and follow-ups for more details. -- @nikomatsakis
See the second code snippet in comment below.
Old text
In the following code, f
compiles but g
does not. It looks like the borrow of a
gets a different lifetime between these 2 functions.
Playground
fn f() { let a = vec![()]; let b = (0 .. 1).map(|_| (|| a.iter())); let _c: Vec<_> = b.collect(); }
fn g() { let a = vec![()]; let c: Vec<_> = (0 .. 1).map(|| (|| a.iter())).collect(); }
fn main() {}
Compiling playground v0.0.1 (file:///playground)
error[E0597]: `**a` does not live long enough
--> src/main.rs:9:43
|
9 | let _c: Vec<_> = (0 .. 1).map(|_| (|| a.iter())).collect();
| -- ^ - borrowed value only lives until here
| | |
| | does not live long enough
| capture occurs here
10 | }
| - borrowed value needs to live until here
error: aborting due to previous error
error: Could not compile `playground`.
To learn more, run the command again with --verbose.