最終更新日時:
が更新

履歴 編集

function
<future>

std::promise::operator=(C++11)

promise& operator=(promise&& rhs) noexcept;      // (1)
promise& operator=(const promise& rhs) = delete; // (2)

概要

  • (1) : ムーブ代入演算子。
  • (2) : コピー代入演算子。コピー禁止。

効果

  • (1) : promise(std::move(rhs)).swap(*this)と等価。

この結果として、以下が行われる:

  1. rhsから一時オブジェクトをムーブ構築する。rhsは共有状態を持たなくなる。
  2. 一時オブジェクトと*thisswapする。*thisrhsが持っていた共有状態を持ち、一時オブジェクトは*thisが元々持っていた共有状態を持つ。
  3. 一時オブジェクトのデストラクタによって、*thisが元々持っていた共有状態が放棄される。すなわち、その共有状態が準備完了状態(future_status::ready)でなければ、error conditionとしてbroken_promiseを持つfuture_error例外オブジェクトを格納したのち準備完了状態にし、そのうえで共有状態を解放する。

戻り値

  • (1) : *this

#include <utility>
#include <future>

int main()
{
  std::promise<int> p1;
  std::promise<int> p2;
  p2 = std::move(p1);
}

出力

バージョン

言語

  • C++11

処理系

参照

  • LWG Issue 4158. packaged_task::operator= should abandon its shared state
    • 効果の記述がpromise(std::move(rhs)).swap(*this)と等価であるという形へ整理された。一時オブジェクトのデストラクタによって古い共有状態が放棄されるため、動作は変わらない。規格としてはC++29のワーキングドラフトへ適用されたが、記述の整理であるためC++11へ遡及して適用される