Mam następujący C++ (11) Kod:Dlaczego std :: move na std :: unique_lock nie ma żadnego efektu?
#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;
}
Nie mogę dowiedzieć się, dlaczego mutex jest nadal w posiadaniu po powrocie z unlock()
. Oczekuję, że std::move()
spowoduje wyjście blokady z zakresu (i odblokowanie przez destruktor) po powrocie z połączenia do unlock()
. Przynajmniej wydaje się, że numer std::move()
powinien spowodować, że ulock
stanie się "niezwiązany" z muteksem m
.
Czego mi brakuje?
'std :: move' sam w sobie nie przenosi niczego. Po prostu rzuca lwartośc do referencji rvalue, pozwalając jej być argumentem konstruktorów ruchu i tym podobnych. Te z kolei mogą ukraść wewnętrzne elementy (jak sądzą) tymczasowe. Ale twój kod nie wywołuje żadnego z nich. 'unlock (std :: move (ulock));' jest skomplikowanym no-op. –
Zdefiniuj 'unlock', aby uzyskać' std :: unique_lock' według wartości, a następnie przejdź do niego, aby zobaczyć efekty – WhiZTiM
Założono, że std :: move() wywołał konstruktor ruchu dla unique_lock. Wygląda na to, że tak nie jest ... Raczej referencja rvalue w 'unlock()' jest "powiadomieniem" o sortowaniu, że * it * może użyć konstruktora ruchu, jeśli tak wybierze (jeśli ma to sens). –