lambda 捕获表达式中的“&”或“=”?

'&' or '=' in lambda capture expression?

我试图理解在以下使用 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 的复制构造函数已禁用。

If I use [&], m_impl is captured by reference, right? If I use [=] m_impl is captured by value, right?

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

使用您喜欢的任何一个。或者 [this],如果你想更明确的话。