簡體   English   中英

c ++ 11 std :: thread用函數編譯,但不編譯

[英]c++11 std::thread compiles with function, but not class

我正在使用帶有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()(請參閱錯誤內聯)。 有誰能解釋一下?

你已經將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失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM