Границы черты более высокого ранга не работают с асин c функциями - PullRequest
0 голосов
/ 19 января 2020

Это базовый пример 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

Почему это так? Возможно ли это обойти или мой код небезопасен?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...