私は、次のC++(11)のコードがあります:mutexがまだunlock()
からの復帰後に開催された理由を私は理解できない何なぜstd :: unique_lock上でstd :: moveを実行しても効果がありませんか?
#include <mutex>
void unlock(std::unique_lock<std::mutex> && ulock)
{
}
int main(void)
{
std::mutex m;
std::unique_lock<std::mutex> ulock(m);
unlock(std::move(ulock));
if (ulock.mutex() == &m || ulock.owns_lock())
{
throw std::runtime_error("");
}
return 0;
}
です。私の期待は、std::move()
が、unlock()
への呼び出しから戻ると、ロックが有効範囲外になり(デストラクタによってロック解除される)ことを期待しています。少なくともstd::move()
はulock
がミューテックスm
から "unbound"になっているはずです。
私には何が欠けていますか?
'std :: move'自体はどこにも移動しません。左辺値を右辺値参照にキャストするだけで、それが移動コンストラクタなどの引数になります。それらは次に、一時的なもの(内部のものと思われるもの)の内部を盗むかもしれません。しかし、あなたのコードはそれらを呼び出すことはありません。 'unlock(std :: move(ulock));'は精巧なノーオペレーションです。 –
'std :: unique_lock'を値で取るように' unlock'を定義し、次にそれに移動して、効果を確認します – WhiZTiM
私はstd :: move()がunique_lockのための移動コンストラクタを呼び出したと仮定していました。そうではないように聞こえます。むしろ、 'unlock()'の右辺値参照は、それが選択すれば(もし意味があれば)moveコンストラクタを使用できるソートの「通知」です。 –