为什么 std::move 对 std::unique_lock 没有任何影响?

Why doesn't std::move on a std::unique_lock have any effect?

本文关键字:std 任何 影响 move unique 为什么 lock      更新时间:2023-10-16

我有以下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"未绑定"。

我错过了什么?

void unlock(std::unique_lock<std::mutex> && ulock)

此处ulock参考。一种特殊的参考,但仍然是一种参考。它只是另一个对象的别名。它的创建不涉及创建新对象,也不涉及任何形式的所有权转让。同样,它的生命周期结束不会导致任何析构函数调用,它只是意味着您丢失了引用其他对象的别名(这并不重要,因为函数无论如何都会结束(。

如果你想转移所有权,你需要一个对象,所以通过值而不是通过引用传递:

void unlock(std::unique_lock<std::mutex> ulock)

现在,您必须move原始锁,因为std::unique_lock不支持复制构造,只支持移动构造。