3

私はc++11フラグでg++4.7を使用しています。このデモでは:

#include <iostream>
#include <thread>

class do_work
{
public:
   void operator()()
   {
     std::cout << "Doing work..." << std::endl;
   }
};

void foo()
{

}

int main()
{
  // Does not work
  std::thread t(do_work);
  t.join(); // error: request for member ‘join’ in ‘t’, which is of non-class type ‘std::thread(do_work)’

  // Works
  std::thread t2(foo);
  t2.join();

  return 0;
}

関数をコンストラクター引数として作成したスレッドでjoin()を正常に呼び出すことはできますが、ファンクターをコンストラクター引数として作成したスレッドでjoin()(エラーインラインを参照)を呼び出すことはできません。誰かがこれを説明できますか?

4

1 に答える 1

12

を取得して返すt関数として宣言しました。do_workstd::thread

あなたはおそらく書きたいでしょう

do_work worker;
std::thread t{worker};

また

std::thread t{do_work{}};

また

std::thread t((do_work()));

ご了承ください

std::thread t(do_work());

動作しません。これは、引数を取らずにを返す関数を取り、を返す関数を宣言し、を返すものとして厄介に解析されます。一時を括弧で囲むか、(任意の時点で)統一された初期化構文を使用すると、修正されます。tdo_workstd::threaddo_work

これは、可能な限り統一された初期化構文を使用する習慣を身につける良い理由です。あなたが書いたなら

std::thread t{do_work};  // incorrect

その場合、コンパイルはその行ではなく失敗しjoinます。

于 2012-09-21T17:21:37.467 に答える