为什么有一个额外的 & 将非静态成员函数的地址传递给 C++ 中的线程?



据我了解,函数的名称本身就是指向它的指针。

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

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 允许省略它;gcc/Windows 默认允许这样做以实现 MSVC 兼容性。

>std::bind帮助你。

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

相关内容

  • 没有找到相关文章

最新更新