std::unique_lock<Mutex>::operator=
From cppreference.com
< cpp | thread | unique lock
| unique_lock& operator=( unique_lock&& other ) noexcept; |
(C++11以降) | |
ムーブ代入演算子。`unique_lock{std::move(other)}.swap(*this); return *this;` と同等です。
`other` が `*this` と同じオブジェクトである場合、効果はありません。それ以外の場合、呼び出し前に `*this` がミューテックスと関連付けられており、それを所有していた場合、ミューテックスはアンロックされます。
目次 |
[編集] パラメータ
| その他 | - | 状態を置き換える別の `unique_lock` |
[編集] 戻り値
*this
[編集] 注釈
再帰ミューテックスを使用する場合、代入前に `*this` と `other` の両方が同じミューテックスを所有している可能性があります。この場合、代入後 `*this` がミューテックスを所有し、`other` は所有しません。
ムーブ代入は未定義の動作を引き起こす可能性があります。例えば、`*this` が `std::adopt_lock` で構築された場合、呼び出し元のスレッドが関連付けられたミューテックスの所有権を持っていないと、関連付けられたミューテックスの所有権を適切に解放できません。
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 2104 | C++11 | ムーブ代入演算子は `noexcept` でしたが、未定義の動作を引き起こす可能性がありました。 | `noexcept` が削除されました。 |
| LWG 4172 | C++11 | LWG2104 により `noexcept` が削除されました。 `unique_lock` の自己ムーブ代入の仕様が不正確でした。 |
`noexcept` が復元されました。 何もしない操作として再仕様化されました。 |