为什么std::lock_guard不可移动,它会使代码更好:
auto locked = lock_guard(mutex);
Run Code Online (Sandbox Code Playgroud)
代替
std::lock_guard<std::mutex> locked(mutex);
Run Code Online (Sandbox Code Playgroud)
创建自己的版本有什么问题,例如:
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);
}
Run Code Online (Sandbox Code Playgroud)
?
任何根本原因让它变得可移动是个坏主意吗?
为什么值为值的值为const,而不是按引用对象捕获:
int a;
auto compile_error = [=]()
{
a = 1;
}
auto compiles_ok = [&]()
{
a = 1;
}
Run Code Online (Sandbox Code Playgroud)
对我来说,这似乎不合逻辑,但它似乎是标准的?特别是因为捕获值的不需要的修改可能是令人讨厌的错误,但是后果仅限于lambda范围的可能性很高,而通过引用捕获的对象的不需要的修改通常会导致更严重的影响.
那么为什么不默认使用const引用?或者至少支持[const&]和[&]?这个设计的原因是什么?
作为解决方法,您可能应该使用由值捕获的std :: cref包装的const引用?