Lambda捕获和成员变量
Lambda captures and member variables
我看了Herb Sutter在2012年c++ and Beyond并发会议上的演讲,他谈到了用c++ 11函数创建一个非阻塞包装器类,他称之为concurrent<T>
。
他的实现是相当简单的(除了需要一个concurrent_queue
,如存在于微软的PPL):
template <class T>
class concurrent {
private:
mutable T t;
mutable concurrent_queue<std::function<void()>> q;
bool done = false;
std::thread thread;
public:
concurrent( T t_ = T{} ) : t{t_}, thread{ [=]{ while( !done ) q.pop()(); }} {}
~concurrent() { q.push( [=]{ done = true; } ); thread.join(); }
template <typename F>
void operator()( F f ) const { q.push( [=]{ f(t); } ); }
};
这似乎很简单,然而,我很困惑,为什么他捕获了成员变量done
和q
的值,而不是通过引用?我的理解是,如果它们是按值捕获的,那么它们将被复制到线程,因此,当队列更新时,工作线程将不会收到更新?
我是否误解了lambda捕获关于类成员变量的工作方式?没有人在视频或演讲的评论中说什么,所以我假设我的理解是错误的,在这种情况下,有人能澄清吗?
成员变量永远不能按值捕获。通过值捕获的是用于访问它们的隐式this
指针。因此,它是按值捕获指针,这意味着它通过引用捕获该对象(及其成员)。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 将包含C样式数组的对象初始化为成员变量(C++)
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 在循环中按顺序遍历成员变量
- c++类声明时,相同的例程,不同的成员变量类型
- 如何从另一个文件继承私有成员变量和公共函数
- 在C++类中,是否必须初始化作为数组的成员变量
- 如何从子成员函数修改父公共成员变量
- 我可以在 C++ 中将数据成员/变量从其定义之外添加到结构中吗?
- 从私有成员变量的成员方法返回unique_ptr
- 在派生类中使用基类的私有成员变量的最佳方法
- 静态 constexpr 类成员变量对多线程读取是否安全?
- C++:是否可以使用非静态成员变量模板?
- 打印所有继承的类成员变量和方法
- 如何在复杂继承中访问静态成员变量
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 成员变量与函数概念检查