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

时间:2017-08-29 19:36:35

标签: c++ c++11 mutex move-semantics

我有以下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成为&#34;未绑定&#34;来自互斥体m

我错过了什么?

1 个答案:

答案 0 :(得分:12)

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

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

如果您想转让所有权,则需要对象,因此请按值而不是按引用传递:

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

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