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_work和返回std::thread.

你可能想写

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

或者

std::thread t{do_work{}};

或者

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

注意

std::thread t(do_work());

行不通;它被令人烦恼地解析为声明一个函数,该函数t接受一个不带参数和返回的函数do_work,然后返回std::thread。用括号包裹do_work临时或使用统一的初始化语法(在任何时候)将修复它。

这是养成尽可能使用统一初始化语法的习惯的一个很好的理由;如果你写

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

那么编译将在该行而不是join.

于 2012-09-21T17:21:37.467 回答