2017-02-08 3 views
2

次のラムダ式の使用例で、変数を参照または値で取り込むことの意味を理解しようとしています。かかわらず、私は上記のコードはOK作品キャプチャブロックに&または=を使用するかどうかのラムダキャプチャ式で '&'または '='ですか?

/** 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のコピーctorが無効になっています。

+0

なぜ 'unique_ptr'に' std :: thread'を格納していますか?これはすでに移動可能です。単に 'std :: thread'を直接使用してヒープ割り当てを避けることができます。 –

+0

私はHerb Sutterのこの例を見て、彼は私よりよく知っていたので - http://www.drdobbs.com/article/print?articleId=225700095&siteSectionName=parallel – ksl

+1

Herbが何を考えているのか分かりませんが、thd =新しいスレッド(bind(&Active :: Run、this)))は完全なナンセンスです。 'unique_ptr'や' bind'を使わずに単純に 'thd = std :: thread(&Active :: Run、this)'にする必要があります –

答えて

2

[&]を使用すると、m_implが参照としてキャプチャされます。私が[=]m_implを使用している場合は、値でキャプチャされますか?

どちらも該当しません。 m_implはまったくキャプチャされません。どちらの場合も、thisがキャプチャされます。しかし、threadはオブジェクトのメンバ変数であるため、thisがキャプチャを指しているので、これは安全です。

好きなものを使用してください。または、より明示したい場合は[this]

+0

'これは値渡しか参照渡しですか?すなわちポインタまたはそれのコピー? – ksl

+1

@ksl右。あなたは 'Thread *'または 'Thread *&'で終わるでしょう。 – Barry

関連する問題