Avertissement C26810

La durée de vie de la variable capturée « var » peut se terminer au moment où la coroutine est reprise.

Notes

Avertissement C26810 est déclenché lorsqu’une variable peut être utilisée après sa durée de vie terminée dans une coroutine reprise.

Nom de l’analyse du code : COROUTINES_USE_AFTER_FREE_CAPTURE

Exemple

Le code suivant génère l’erreur C26810.

#include <experimental/generator>
#include <future>

using namespace std::experimental;

coroutine_handle<> g_suspended_coro;

// Simple awaiter to allows to resume a suspended coroutine
struct ManualControl
{
  coroutine_handle<>& save_here;

  bool await_ready() { return false; }
  void await_suspend(coroutine_handle<> h) { save_here = h; }
  void await_resume() {}
};

void bad_lambda_example1()
{
  int x = 5;
  auto bad = [x]() -> std::future<void> {
    co_await ManualControl{g_suspended_coro};  // @expected(26810), Lifetime of capture 'x' might end by the time this coroutine is resumed.
    printf("%d\n", x);
  };
  bad();
}

Pour corriger cet avertissement, envisagez d’utiliser des arguments par valeur au lieu de captures :

void bad_lambda_example1()
{
  int x = 5;
  auto good = [](int x) -> std::future<void> {
    co_await ManualControl{g_suspended_coro};
    printf("%d\n", x);
  };
  good(x);
}

Sinon, si la coroutine est garantie de vivre plus courte que l’objet lambda, utilisez gsl::suppress pour supprimer l’avertissement et documenter les contrats de durée de vie dans un commentaire.

Voir aussi

C26811