因爲非靜態成員函數在編譯的時候,會在參數列表中加入this指針指向對象本身,之後可以通過this指針訪問類成員。
而靜態成員函數不屬於對象,而是屬於整個類,相當於全局函數,在編譯的時候參數列表是不會進行擴展,加入this指針的。
因此,如果綁定的是一個非靜態成員函數,在編譯的時候,解析參數列表就會出現錯誤,導致編譯失敗。
下面是綁定非靜態類成員函數的代碼及編譯結果:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <thread>
using namespace std;
class people
{
public:
void fun(int a)
{
cout << "a = " << a << endl;
};
};
int main(void)
{
std::thread t(&people::fun, 1);
t.join();
return 0;
}
結果編譯錯誤,未找到相應的重載函數,參數不匹配,當然找不到!:
下面是綁定靜態類成員函數的代碼及編譯結果:(正確姿勢)
其實就是在成員函數裏面加了一個static聲明
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <thread>
using namespace std;
class people
{
public:
static void fun(int a)
{
cout << "a = " << a << endl;
};
};
int main(void)
{
std::thread t(&people::fun, 1);
t.join();
return 0;
}
運行結果如下:
謝謝閱讀