在C++03编译器中用Boost移动模拟返回含boost::unique_lock的对象是否安全?
结论:该移动锁的预期行为可以得到保证
在C++03编译器上借助Boost库的移动语义模拟实现时,你的wrapper_with_lock类的移动锁行为完全符合预期,具体原因如下:
Boost移动模拟的有效性
Boost的BOOST_MOVABLE_BUT_NOT_COPYABLE宏会自动禁用类的拷贝构造和拷贝赋值运算符,同时BOOST_RV_REF宏在C03环境下通过特殊的引用包装类型,实现了类似C11右值引用的语义,能够正确区分移动操作和拷贝操作,确保你的移动构造/赋值函数只会在“移动场景”下被调用。boost::unique_lock的移动语义支持
Boost.Thread库在C++03时代就为boost::unique_lock提供了移动语义的模拟:- 调用
boost::move(x.l)时,unique_lock的锁所有权会从原对象x.l转移到新对象l - 移动完成后,原
x.l会处于不持有锁的状态,其析构时不会触发解锁操作 - 新的
l会完全接管原锁的持有权,直到自身析构时才会释放锁
- 调用
代码逻辑的正确性
你的移动构造/赋值函数实现完全匹配Boost的移动语义规则:- 移动构造中,先转移
unique_lock的所有权,再移动数据指针并将原指针置空,避免悬空指针问题 - 返回场景中
return boost::move(w)会触发移动构造,将锁的所有权从局部对象w转移到返回值对象;w在移动后不再持有锁,其析构不会提前释放锁;调用方接收返回值后,会持有有效的锁,直到自身作用域结束才解锁
- 移动构造中,先转移
内容的提问来源于stack exchange,提问作者The amateur programmer
相关产品推荐
相关产品推荐

