返回锁时C++11移动

C++11 move when returning a lock

本文关键字:移动 C++11 返回      更新时间:2023-10-16

在《C++并发操作》一书中,阅读以下方法

std::unique_lock<std::mutex> wait_for_data()
{
    std::unique_lock<std::mutex> head_lock(head_mutex);
    data_cond.wait(head_lock,[&]{return head.get()!=get_tail();});
    return std::move(head_lock);
 }

我不明白为什么返回时head_lock是std::move-ed。我对移动用法和RVO的概念和直觉与C++11右值和移动语义混淆(返回语句)中的观点一致

但我有点倾向于相信作者会知道得更好。有人能澄清一下什么时候std::move返回值更好吗?锁有什么特别的地方吗?谢谢

无论有没有std::move都可以。局部变量*的名称在return语句中被视为右值,导致在这两种情况下都调用move构造函数。作者使用std::move大概是出于风格上的原因,以表明锁正在被移动。它确实会干扰NRVO,但与锁定和等待的成本相比,在这里移动unique_lock的成本可能是最小的。

用@Deduplior的话来说,这是"为了强调实际语义而进行的一种讨厌化"。

你可以自己测试——unique_lock不能被复制,所以如果它是一个副本,return head_lock;就不会编译。


*这是C++14规则。C++11规则仅限于允许或将允许复制省略的情况,除非变量是函数参数。就这个问题而言,这种差异是无关紧要的,因为head_lock显然符合副本省略的条件