'&安培;'或lambda捕获表达式中的'='?

时间:2017-02-08 14:19:54

标签: c++11 lambda stdthread

我正在尝试通过以下示例使用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的副本被禁用。

1 个答案:

答案 0 :(得分:2)

  

如果我使用[&]m_impl会被引用捕获,对吧?如果我使用[=] m_impl按值捕获,对吧?

这些都不是真的。根本没有捕获m_impl。在这两种情况下,都会捕获this。但由于thread是对象的成员变量,其this指针正在捕获,因此(ha!)是安全的。

使用您喜欢的任何一种。或[this],如果您想要更明确。