次のラムダ式の使用例で、変数を参照または値で取り込むことの意味を理解しようとしています。かかわらず、私は上記のコードは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が無効になっています。
なぜ 'unique_ptr'に' std :: thread'を格納していますか?これはすでに移動可能です。単に 'std :: thread'を直接使用してヒープ割り当てを避けることができます。 –
私はHerb Sutterのこの例を見て、彼は私よりよく知っていたので - http://www.drdobbs.com/article/print?articleId=225700095&siteSectionName=parallel – ksl
Herbが何を考えているのか分かりませんが、thd =新しいスレッド(bind(&Active :: Run、this)))は完全なナンセンスです。 'unique_ptr'や' bind'を使わずに単純に 'thd = std :: thread(&Active :: Run、this)'にする必要があります –