为什么的std :: lock_guard不可移动的,它将使代码,以便好得多:为什么std :: lock_guard不能移动?
auto locked = lock_guard(mutex);
,而不是
std::lock_guard<std::mutex> locked(mutex);
有什么问题与创建您自己的版本,如:
template <typename T> class lock_guard_
{
T* Mutex_;
lock_guard_(const lock_guard_&) = delete;
lock_guard_& operator=(const lock_guard_&) = delete;
public:
lock_guard_(T& mutex) : Mutex_(&mutex)
{
Mutex_->lock();
}
~lock_guard_()
{
if(Mutex_!=nullptr)
Mutex_->unlock();
}
lock_guard_(lock_guard_&& guard)
{
Mutex_ = guard.Mutex_;
guard.Mutex_ = nullptr;
}
};
template <typename T> lock_guard_<T> lock_guard(T& mutex)
{
return lock_guard_<T>(mutex);
}
?
任何根本原因,这将是一个坏主意,使其可移动?
那么,你有'unique_lock'。这可能只是使界面尽可能简单。 – ecatmur
谢谢,我忽略了unique_lock :-)所以我想这回答了我的问题:没有没有理由。 Imo使它可移动并不会使界面更加复杂,但更加可用并且与现代C++兼容。 – valoh
@valoh:如果它是可移动的,它将需要一个不锁定锁的状态。这使得它成为多余的,因为它将提供与'unique_lock'完全相同的功能(尽管我会认为它无论如何都是多余的)。因此,如果'lock_guard'作为一个单独的课程是需要的,它不能真正移动。 – Grizzly