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
显然有资格获得复制.