Open
Description
From this SO question, the following code does not compile:
trait Iterable {
fn owned_iter(&self) -> impl Iterator<Item = usize> + 'static;
}
struct B<T> {
x: T,
}
impl<T: Iterable + Clone> Iterable for B<T> {
fn owned_iter(&self) -> impl Iterator<Item = usize> + 'static {
let y = self.x.clone();
y.owned_iter() // error[E0597]: `y` does not live long enough
}
}
However, boxing the iterator as a trait object allows it to compile:
trait Iterable {
fn owned_iter(&self) -> impl Iterator<Item = usize> + 'static;
}
struct B<T> {
x: T,
}
impl<T: Iterable + Clone> Iterable for B<T> {
fn owned_iter(&self) -> impl Iterator<Item = usize> + 'static {
let y = self.x.clone();
let b: Box<dyn Iterator<Item = usize>> = Box::new(y.owned_iter());
b
}
}
Notably, not cloning self.x
and simply returning self.x.owned_iter()
also works.
I don't see any reason why the first code block shouldn't compile, especially while the boxed version and the non-cloning version do.
Meta
rustc --version --verbose
:
rustc 1.81.0 (eeb90cda1 2024-09-04)
binary: rustc
commit-hash: eeb90cda1969383f56a2637cbd3037bdf598841c
commit-date: 2024-09-04
host: x86_64-unknown-linux-gnu
release: 1.81.0
LLVM version: 18.1.7
It also fails to compile on 1.83.0-nightly (2024-10-09 eb4e234).