小编val*_*loh的帖子

为什么std :: lock_guard不可移动?

为什么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)

任何根本原因让它变得可移动是个坏主意吗?

c++ standards multithreading movable c++11

24
推荐指数
2
解决办法
5203
查看次数

Lambda:为什么按值捕获值为const,而不是按引用值捕获?

为什么值为值的值为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引用?

c++ lambda const capture c++11

7
推荐指数
2
解决办法
8228
查看次数

标签 统计

c++ ×2

c++11 ×2

capture ×1

const ×1

lambda ×1

movable ×1

multithreading ×1

standards ×1