Skip to content

Commit

Permalink
packaged_taskムーブ代入演算子とresetの効果を追記。備考で実装について補足 #1270
Browse files Browse the repository at this point in the history
  • Loading branch information
tshino committed May 6, 2024
1 parent d12d621 commit 599f09f
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 2 deletions.
12 changes: 11 additions & 1 deletion reference/future/packaged_task/op_assign.md
Expand Up @@ -18,7 +18,10 @@ packaged_task& operator=(packaged_task&& rhs) noexcept; // (2)


## 効果
- (2) : `*this`の共有状態を解放し、`packaged_task(`[`std::move`](/reference/utility/move.md)`(rhs)).swap(*this)`を行う。
- (2) :
1. まず現在の共有状態が準備完了状態([`future_status::ready`](../future_status.md))でなければ、error conditionとして[`broken_promise`](../future_errc.md)を持つ[`future_error`](../future_error.md)例外オブジェクトを格納したのち、準備完了状態にする。ただし、実装によっては、この動作が行われない場合がある(備考を参照)。
2. 現在の共有状態を解放する。
3. `packaged_task(`[`std::move`](/reference/utility/move.md)`(rhs)).swap(*this)`を行う。


## 戻り値
Expand All @@ -29,6 +32,13 @@ packaged_task& operator=(packaged_task&& rhs) noexcept; // (2)
- (2) : 投げない


## 備考
C++11の仕様では、ムーブ代入演算子の効果として古い共有状態は「放棄する(abandon)」ではなく「解放する(release)」となっているが、仕様の他の項目(Shared States, Class template promise, および Class template packaged_task内のvoid reset();)の記載との整合性を欠いており、「放棄する(abandon)」とする方が合理性があるため効果の項にはそのように記載した。

「(共有状態を)放棄する(abandon)」とは効果の項(2)の1と2が行われることをいい、「(共有状態を)解放する(release)」とは効果の項(2)の2のみが行われることである。通常、[`promise`](../promise.md)および`packaged_task`は処理結果を提供する側であるため共有状態を所有しなくなるときには前者を行い、[`future`](../future.md)および[`shared_future`](../shared_future.md)は処理結果を受け取る側であるため共有状態を所有しなくなるときには後者を行う。

なお、実際の実装ではClangおよびGCCでは「放棄する(abandon)」の動作になっているが、Visual C++では「解放する(release)」の動作になっている。

##
```cpp example
#include <future>
Expand Down
2 changes: 1 addition & 1 deletion reference/future/packaged_task/reset.md
Expand Up @@ -21,7 +21,7 @@ void reset();
```
* std::move[link /reference/utility/move.md]

によって、新たに共有状態を作成する。古い共有状態は放棄される。
によって、新たに共有状態を作成する。古い共有状態は放棄される(詳細は[`operator=`](op_assign.md)を参照)

`f`はメンバ変数として保持している、非同期実行する関数オブジェクト。

Expand Down

0 comments on commit 599f09f

Please sign in to comment.