c ++ 11 std :: thread用函数编译,但不编译

时间:2012-09-21 17:19:30

标签: c++ c++11 std

我正在使用带有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(),但是我不能在用functor创建的线程上调用join()(请参阅错误内联)作为其构造函数参数。谁能解释一下呢?

1 个答案:

答案 0 :(得分: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());

不起作用;它是vexingly parsed声明函数t采用不带参数的函数并返回do_work并返回std::thread。用括号包装do_work临时值或使用统一初始值设定语法(在任何时候点)将解决它。

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

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

然后编译将在该行上失败而不是join