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
Isto é C++ inválido. Isso funciona para você porque o MinGW GCC habilita implicitamente
-fms-extensions
(imitando recursos não padrão do MSVC).Duvido que isso seja novidade no GCC 14. Não tenho um MinGW GCC 13 disponível para testar, mas ele sempre fez isso (adicionou o sinalizador), e o GCC 13 no Linux com esse sinalizador aceita seu código também.
Passe
-fno-ms-extensions
para desabilitar essa bobagem. Não sei por que está ativado por padrão. (E você pensaria-std=c++?? -pedantic-errors
que desabilitaria isso, mas infelizmente não desabilita.)