Это базовый пример c HRTB, и он работает правильно:
fn foo(_x: &i32) {
}
fn bar<FUN>(fun: FUN)
where FUN: for<'r> FnOnce(&'r i32),
{
let x = 42;
fun(&x);
}
fn main() {
bar(foo);
}
Но эквивалентный код async
не работает ( детская площадка ):
async fn foo(_x: &i32) {
}
async fn bar<FUN, FUT>(fun: FUN)
where FUN: for<'r> FnOnce(&'r i32) -> FUT,
FUT: std::future::Future,
{
let x = 42;
fun(&x).await;
}
fn main() {
bar(foo);
}
Не удается скомпилировать это сообщение об ошибке:
error[E0271]: type mismatch resolving `for<'r> <for<'_> fn(&i32) -> impl std::future::Future {foo} as std::ops::FnOnce<(&'r i32,)>>::Output == _`
--> src/main.rs:13:5
|
4 | async fn bar<FUN, FUT>(fun: FUN)
| ---
5 | where FUN: for<'r> FnOnce(&'r i32) -> FUT,
| --- required by this bound in `bar`
...
13 | bar(foo);
| ^^^ expected bound lifetime parameter 'r, found concrete lifetime
Почему это так? Возможно ли это обойти или мой код небезопасен?