それは一生終了したオブジェクトのメンバ関数のコルーチンを再開するUBていますか?

マイク彼

この質問は、このコメントから茎:C ++ 20のコルーチンのためのラムダ生涯説明

この例について:

auto foo() -> folly::coro::Task<int> {
    auto task = []() -> folly::coro::Task<int> {
        co_return 1;
    }();
    return task;
}

返されたコルーチンを実行するかどうかの質問は、だから、fooUBにつながります。

(オブジェクトの有効期間が終了した後)メンバ関数「を呼び出すと、」UBです:http://eel.is/c++draft/basic.life#6.2

...オブジェクトがされるか、配置された記憶位置のアドレスを表す任意のポインタはなくのみ限定の方法で使用することができます。[...]このプログラムは未定義の動作の場合があります。

[...]

-ポインタは非静的データメンバにアクセスしたりするために使用されるオブジェクトの非静的メンバ関数を呼び出し、または

しかし、この例では:

  • ()ラムダの寿命がまだ有効である一方、ラムダのオペレーターが呼び出されます
  • 次に、それを中断され、
  • その後、ラムダが破壊され、
  • そしてその後、メンバ関数(演算子は())その後ある時点で再開されます。

この再開は、未定義の動作と考えていますか?

コロンボ:

[dcl.fct.def.coroutine] P3

約束型コルーチンのであるstd::coroutine_traits<R, P1, ..., Pn>::promise_type場合、R関数の戻り型であり、そしてP1 ... Pn、関数パラメータのタイプの配列で暗黙オブジェクトパラメータのタイプが先行コルーチンが非静的である場合(12.4.1)メンバ関数。

暗黙のオブジェクトパラメータは、閉鎖オブジェクトが破棄された後、実行が再開されたときに参照がダングリングすること、従ってあなたの例ではconst参照であり、。

しかし、メンバ関数の実行中に破壊されるオブジェクトの音符に、これはそれ自体微細確かであり、そして標準自体よりも他には、このことを意味しない[基本]

オブジェクトの有効期間が開始されました前にそのオブジェクトが占有するストレージは、オブジェクトが占有するストレージを再利用またはリリースされる前に、オブジェクトの有効期間は、のアドレスを表す任意のポインタを終了した後に、割り当てられたか、された後オブジェクトがされるか、配置された記憶場所はなく、限られた方法で使用することができます。[...]

void B::mutate() {
  new (this) D2;    // reuses storage --- ends the lifetime of *this
  f();              // undefined behavior
  ... = this;       // OK, this points to valid memory
}

(NB:暗黙のためUB上であるthis洗濯まだ暗黙のオブジェクトパラメータを指していません。)

あなたの例では、明確に定義されているように見えるので、アイデアを条件に、実行の再開は、元の呼び出しと同じ規則に該当しないこと。閉鎖オブジェクトへの参照は、ダングリングかもしれないが、それは、サスペンションと再開との間の任意の方法でアクセスしていないことに留意されたいです。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=369484&siteId=1