为什么 std::move 对 std::unique_lock 没有任何影响?
Why doesn't std::move on a std::unique_lock have any effect?
我有以下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
不支持复制构造,只支持移动构造。
相关文章:
- 为什么 std::lerp 不适用于任何已实现所需操作的类型?
- std::stoi 的版本拒绝任何非数字
- main() 中的 std::cout 在调试期间不会在调试控制台中打印任何内容
- 如何制作可以接受任何类型的参数的 std::函数和 lambda
- std::map 保存任何值类型
- 使用 std::addressof(std::cout) 而不是 &std::cout 是否有任何风险?
- 为什么 std::erase(std::erase_if) 不是适用于<algorithm>任何容器的模板?
- 如何创建一个模板化函数,可以在任何具有字符串键的 std::map 上运行?
- std::atomic中的任何内容都是免费等待的
- std::任何只用于移动的模板,其中副本ctor内的static_assert等于编译错误,但为什么
- std:任何没有RTTI的,它是如何工作的
- 为什么 std::move 对 std::unique_lock 没有任何影响?
- 在 std::getline() 上使用任何字符作为分隔符
- 如何访问"std::variant"的任何子级的"多态"基类?
- std::ifstream.read() 不会向我的缓冲区返回任何内容
- 对于C++,是否有任何现代的 std::strchr() 替代品?
- any_cast std::任何指向特定指针类型的指针
- std:任何抛出异常解析函数类型
- 试图在具有std ::任何构造函数的基类中调用复制构造函数的问题
- STD ::变体与STD ::任何当类型移动时可构造时