jthread& operator=(const jthread&) = delete; // (1) C++20
jthread& operator=(jthread&& x) noexcept; // (2) C++20
概要
jthreadオブジェクトの代入。
- (1) : コピー代入。コピー不可
- (2) : ムーブ代入。ムーブ不可
効果
&x == this(自己代入)の場合、効果はない- それ以外の場合、以下を行う
joinable()がtrueを返す場合、request_stop()とjoin()を呼び出すxの状態を*thisに代入し、xをデフォルト構築された状態に設定する
事後条件
get_id()の呼び出しでは、代入前のx.get_id()が返されるようになること- メンバ変数として保持している
std::stop_source型オブジェクトssourceは、代入前のx.ssourceの値を持つこと
戻り値
*thisを返す。
例
#include <thread>
#include <cassert>
#include <utility>
int main()
{
std::jthread jt1([]{ /*...*/ });
std::jthread jt2;
assert(jt1.joinable() && !jt2.joinable());
// jt1からjt2へムーブ代入
jt2 = std::move(jt1);
assert(!jt1.joinable() && jt2.joinable());
jt2.join();
}
出力
バージョン
言語
- C++20
処理系
- Clang:
- GCC: 10.2.0 ✅
- Visual C++: ??
参照
- LWG Issue 3788.
jthread::operator=(jthread&&)postconditions are unimplementable under self-assignment- C++23で、自己代入(
&x == this)の場合は効果がないことが効果に明記され、自己代入時に成立しない事後条件(x.get_id() == id()、x.ssource.stop_possible()がfalse)が削除された
- C++23で、自己代入(