確認した環境
- Windows10
- Visual Studio Community 2019 Version 16.2.5
本題
std::thread の1番目の引数にクラスのメンバ関数を渡すとき、
そのメンバ関数が static かそうでないかで書き方が異なります。
static でないメンバ関数では2番目の引数に this を指定するという違いもありますが、
それだけでなく1番目の引数において、
static メンバ関数ではコンパイルが通る書き方でも static でないメンバ関数では通らない書き方があります。
以下にコードを示します。
class MyClass { public: explicit MyClass(int n) : n_(n) {} void run() { sth_ = std::thread(static_member_func); // OK //sth_ = std::thread(MyClass::static_member_func); // OK //sth_ = std::thread(&static_member_func); // OK //sth_ = std::thread(&MyClass::static_member_func); // OK //th_ = std::thread(member_func, this); // NG //th_ = std::thread(MyClass::member_func, this); // NG //th_ = std::thread(&member_func, this); // NG th_ = std::thread(&MyClass::member_func, this); // OK } void join() { sth_.join(); th_.join(); } private: static void static_member_func() { std::cout << "MyClass::static_member_func" << std::endl; } void member_func() { std::cout << "MyClass::member_func (n = " << n_ << ")" << std::endl; }; int n_; std::thread sth_; std::thread th_; };
上記コードのrun
メソッドにおいて各メンバ関数で4通りの書き方を示しました。
static メンバ関数では、4つのうち3つはコメントアウトしてますが、4通りすべての書き方でコンパイルが通ります。
一方、static でないメンバ関数では4通りのうちコメントアウトしていない1つの書き方のみコンパイルが通り、
残りの3つの書き方ではコンパイルが通りません。