我正在尝试通过以下示例使用lambda表达式来理解通过引用或值捕获变量的含义。
/** Encapsulates the private implementation details of Thread. */
struct Thread::Impl
{
public:
Impl() : m_queue(), m_thread()
{
}
private:
Impl(const Impl&);
const Impl& operator=(const Impl&);
void run()
{
// do some work
}
std::unique_ptr<std::thread> m_thread;
friend class Thread;
};
Thread::Thread() : m_impl(new Impl())
{
// start the thread
// ************************************
// '=' or '&' in the the capture block?
// ************************************
m_impl->m_thread = std::unique_ptr<std::thread>(new std::thread( [&]{ m_impl->run(); } ));
}
无论我在捕获块中使用&
还是=
,上面的代码都可以正常工作。那我该使用哪个?
如果我使用[&]
,m_impl
会被引用捕获,对吧?
如果我使用[=]
m_impl
按值捕获,对吧?但我不明白它为什么编译。是什么制作副本? Impl的副本被禁用。
答案 0 :(得分:2)
如果我使用
[&]
,m_impl
会被引用捕获,对吧?如果我使用[=]
m_impl
按值捕获,对吧?
这些都不是真的。根本没有捕获m_impl
。在这两种情况下,都会捕获this
。但由于thread
是对象的成员变量,其this
指针正在捕获,因此(ha!)是安全的。
使用您喜欢的任何一种。或[this]
,如果您想要更明确。