【发布时间】:2018-02-07 09:08:56
【问题描述】:
我有以下 C++(11) 代码:
#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本身不会在任何地方移动任何东西。它只是将左值转换为右值引用,允许它成为移动构造函数等的参数。反过来,那些人可能会窃取(他们认为是)临时的内部结构。但是您的代码没有调用它们中的任何一个。unlock(std::move(ulock));是一个精心设计的无操作。 -
定义
unlock取std::unique_lock的值,然后移入其中,查看效果 -
我假设 std::move() 为 unique_lock 调用了移动构造函数。听起来情况并非如此......相反,
unlock()中的右值引用是一种“通知”,it 可以使用移动构造函数(如果这有意义的话) . -
是的,没错。
std::move是移动的许可,而不是其行为。std::move(T& v)只是做return static_cast<T&&>(v);而已。 -
@IgorTandetnik:您应该(已经)发布(编辑)您的评论作为答案。我会接受,因为你是第一个。
标签: c++ c++11 mutex move-semantics