7
我有以下的C++(11)代码:为什么不std :: move在std :: unique_lock上有什么作用?
#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;
}
我无法弄清楚究竟是为什么互斥从unlock()
回归后仍持有。我的期望是std::move()
在从呼叫返回到unlock()
时导致锁定超出范围(并且被析构函数解锁)。至少,似乎std::move()
应该已经导致ulock
从互斥体m
变为“解除绑定”。
我错过了什么?
'std :: move'本身并没有移动任何东西。它只是将一个左值赋给一个右值引用,使其成为移动构造函数等的一个参数。反过来,这些可能会窃取(他们认为是)临时内部的东西。但是你的代码不会调用其中的任何一个。 '解锁(std :: move(ulock));'是一个复杂的无操作。 –
定义'unlock'以通过值获取'std :: unique_lock',然后进入它,以查看效果 – WhiZTiM
我假设std :: move()调用了unique_lock的移动构造函数。这听起来不是这种情况...而是,'unlock()'中的右值引用是一种“通知”,它可以使用移动构造函数(如果有意义的话)。 –