g++13(Linux)与g++14(MSYS2 Windows)成员指针语法差异问询
g++ 13与MSYS2 g++14的非静态成员函数语法差异
以下代码在Windows 10平台MSYS2环境的g14(版本:g.exe (Rev2, Built by MSYS2 project) 14.2.0)中可正常编译运行:
#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; }
但在Linux平台的g++13中编译该代码时,会触发错误:
error: invalid use of non-static member function 'void A::f()'
解决方案
将构造std::thread的代码修改为显式取成员函数的地址,即可兼容两个版本:
std::thread t(&A::f,&a);
原因说明
C标准规定,非静态成员函数的名称本身不会隐式转换为成员函数指针,必须通过&运算符显式获取指针。MSYS2的g14可能实现了非标准扩展,允许省略&直接使用成员函数名;而g++13严格遵循标准要求,因此必须显式取地址才能通过编译。
内容的提问来源于stack exchange,提问作者n0dus
相关产品推荐
相关产品推荐

