C++ 为什么会有额外的&;将非静态成员函数的地址传递给C++;?

C++ 为什么会有额外的&;将非静态成员函数的地址传递给C++;?,c++,gcc,mingw,member-function-pointers,C++,Gcc,Mingw,Member Function Pointers,据我所知,函数名本身就是指向它的指针 因此,当我有一个函数时,我可以通过简单地将其地址传递给线程构造函数来创建线程,如下所示: void thread_function { } std::thread threadObj1(thread_function); 我的困惑在于将非静态成员函数的地址传递给线程时。例如: class ClassA { public: void nonstatic_function() { } }; ClassA instance; std::t

据我所知,函数名本身就是指向它的指针

因此,当我有一个函数时,我可以通过简单地将其地址传递给线程构造函数来创建线程,如下所示:

void thread_function {

}

std::thread threadObj1(thread_function);
我的困惑在于将非静态成员函数的地址传递给线程时。例如:

class ClassA
{
  public:
  void nonstatic_function()
  {

  }
};

ClassA instance;
std::thread threadObj2(ClassA::nonstatic_function, &instance);
通过两种方式传递此类函数的地址:

ClassA::nonstatic_function

&ClassA::nonstatic_function
为什么会有额外的
&
?如果确实需要它,那么编译器为什么即使没有它也不抱怨呢

据我所知,函数名本身就是指向它的指针

此行为继承自C,仅适用于自由函数或静态成员函数

对于非静态成员函数,不存在指向成员指针的隐式转换。指向成员的指针与自由函数指针完全不同,因为如果不提供对象实例,就无法调用它

如果确实需要它,那么编译器为什么即使没有它也不抱怨呢


我猜您正在使用一个带有非标准扩展名的编译器来允许在这种情况下省略
&
。我相信MSVC的旧版本允许它被省略;和。

代码>标准::绑定帮助您

ClassA instance;
std::thread threadObj2(std::bind(&ClassA::nonstatic_function, &instance));

我相信你是路过这里的。我不是说&instance。对于非成员函数,函数名用作指向它的指针。成员函数的规则并不是很宽松——尽管有些编译器很草率,但规则是你必须说
&class\u name::function\u name
,才能获得成员函数的地址。你是在使用MSVC还是mingw-w64?@MM,是的,它是mingw-w64。明白了,我最好遵循标准,在静态/非静态成员函数前面加一个&。