Observei um comportamento interessante do g++ nas versões 13 e 14. O código a seguir funciona bem no g++14 (MSYS2, MinGW, Windows):
#include <iostream>
#include <thread>
class A
{
public:
void f()
{
std::cout<<"Okay!\n";
}
};
int main(int argc,char **argv)
{
A a;
std::thread t(A::f,&a);
t.join();
return 0;
}
Tentar compilar com g++13 (Linux), no entanto, produz:
error: invalid use of non-static member function 'void A::f()'
Mudando apenas
std::thread t(A::f,&a);
para
std::thread t(&A::f,&a);
resolve o problema. Aparentemente, na variante não-MSYS2, uma função membro não poderia ser usada no lugar de um argumento de função, mas um ponteiro para uma função membro poderia?
Isto foi testado no g++14 com MSYS2 (Windows 10). Aparentemente, outras versões do g++14 não funcionam.
$ g++ --version
g++.exe (Rev2, Built by MSYS2 project) 14.2.0