返回锁定时C++ 11移动

29 c++ move-semantics rvo c++11

在"C++ Concurrency in Action"一书中阅读以下方法

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);
 }
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么返回时head_lock是std :: move-ed.我对移动用法和RVO的观念和直觉与C++ 11 rvalues中共享的观点相匹配,并且移动了语义混淆(return语句)

但我倾向于相信作者更了解.有人可以澄清什么时候std :: move返回值更好,是否有关于锁的具体内容?谢谢.

T.C*_*.C. 26

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

用@ Deduplicator的话说,它是"为了强调实际语义而悲观化".

您可以自己测试 - unique_lock无法复制,因此return head_lock;如果它是副本则不会编译.


*这是C++ 14规则.C++ 11规则仅限于允许或允许复制省略的情况,但变量是函数参数的事实除外.就这个问题而言,这种差异并不重要,因为head_lock显然有资格获得复制.

  • @LeonardoBernardini请在喊叫之前阅读我写的内容. (8认同)
  • 总之,悲观化是为了强调实际的语义. (5认同)
  • 我尝试不动编译,g++居然编译了。 (2认同)